LINUX.ORG.RU

Сборка оптимизированного ffmpeg

 ,


1

2

Начинаю тут(пришлось) потихоньку компилировать в с\с++. Хочу скомпилировать(собрать) оптимизированный(по размеру) статичный ffmpeg. Все хорошо собирается, статичный бинарь получается около 2 мб. Но стоит мне добавть SDL2, чтобы собрать ffplay, сборка проходит нормально, но при запуске вылазит ошибка что не может найти либу libwinpthread-1.dll. В документации ffmpeg по сборке mingw говорится что это якобы кривой gcc добавляет эту либу, вне зависимости от параметров сборки.

https://trac.ffmpeg.org/wiki/CompilationGuide/MinGW

Unfortunately the gcc.exe it provides seems to create binary's that require files like «libgcc_s_dw2-1.dll» and «libwinpthread-1.dll» (etc.?) to accompany your executable, so can cause some difficulty there. You can remove some files to remove dependencies on things like «libbzip2.dll» see ​https://ffmpeg.zeranoe.com/forum/viewtopic.php?f=5&t=3688 and possibly avoid the libgcc.dll requirement by using "-static" at linking time.

и предлагает удалить какие то файлы, которые вызывают эти зависимости. Какие именно файлы не уточняется и указывается ссылка на домен ffmpeg.zeranoe.com который сейчас не доступен (искал в кеше, не нашел)

Как бы мне избавиться от этой libwinpthread?

ldd ffmpeg.exe
libwinpthread-1.dll => /mingw64/bin/libwinpthread-1.dll


Собираю так


#!/bin/sh
./configure \
--arch=x86_64 \
--disable-shared \
--enable-static \
--disable-pthreads \
--disable-w32threads \
--disable-os2threads \
--disable-x86asm \
--disable-alsa \
--disable-appkit \
--disable-avfoundation \
--disable-bzlib \
--disable-coreimage \
--disable-iconv \
--disable-libxcb \
--disable-libxcb-shm \
--disable-libxcb-xfixes \
--disable-libxcb-shape \
--disable-lzma \
--disable-sndio \
--disable-xlib \
--disable-zlib \
--disable-amf \
--disable-audiotoolbox \
--disable-cuda \
--disable-cuvid \
--disable-d3d11va \
--disable-dxva2 \
--disable-nvdec \
--disable-nvenc \
--disable-v4l2-m2m \
--disable-vaapi \
--disable-vdpau \
--disable-videotoolbox \
--disable-everything \
--enable-decoder=h264,aac,mp3 \
--enable-encoder=aac,libmp3lame \
--enable-parser=h264,aac,mp3 \
--enable-demuxer=flv,mov,mpegts,h264,aac,mp3,live_flv \
--enable-muxer=flv,mov,mpegts \
--enable-protocol=file,rtmp,pipe,hls \
--enable-bsf=aac_adtstoasc,h264_mp4toannexb \
--disable-avdevice --disable-postproc --disable-doc \
--disable-runtime-cpudetect \
--enable-gpl --enable-version3 --enable-sdl2 \
--enable-avcodec --enable-avformat --enable-swresample --enable-avfilter \
--enable-ffmpeg --enable-ffplay --enable-small


★★★★

Последнее исправление: gobot (всего исправлений: 2)

Ответ на: комментарий от xDShot

Ухх, класс, спасибо большое! Заработало

Можно сразу другой вопрос, я для теста линковки написал небольшую программку

#define LIBICONV_PLUG 1;

#include <stdint.h>
#include <iconv.h>



int main(){
iconv_t cd;
cd = iconv_open("blabla", "utf-8");

return 1;
}


замем собираю так
gcc  test.cpp -liconv
undefined reference to `iconv_open'
collect2.exe: error: ld returned 1 exit status

Что не так? Либу как я понял он видит, она есть в (/lib/libiconv.a)

stat /mingw64/lib/libiconv.a
File: /mingw64/lib/libiconv.a


Пробовал и так
gcc  test.cpp -L/mingw64/lib -liconv


Все равно не цепляет iconv

gobot ★★★★
() автор топика
Ответ на: комментарий от anonymous

У меня нет цели собрать любым способом. Я специально для теста написал эту «программу». Хочу понять почему компоновщик не цепляет эту либу обычным способом

gobot ★★★★
() автор топика
Ответ на: комментарий от gobot

почему компоновщик не цепляет эту либу

Наверное потому, что ты не пользуешь -static, а so-шки у тебя нету.

anonymous
()
Ответ на: комментарий от gobot

-Wl,-V

что бы увидеть что оно там ищет и линкует

anonymous
()

оптимизированный(по размеру) статичный ffmpeg

добавть SDL2, чтобы собрать ffplay

Вообще, ffplay — это простая демка возможностей ffmpeg, не очень понятно, зачем тебе её потребовалось добавлять в оптимизированный статичный ffmpeg. Оно, в основном, чтобы изучать её исходник и делать по образцу. Например, если ты кладёшь ffmpeg на сервер, чтобы его откуда-то (из скриптов, например) автоматом дёргать, ни ffplay, ни SDL2 тебе точно не нужны.

hobbit ★★★★★
()
Ответ на: комментарий от hobbit

О, у nvidia есть nvenc аппаратный, которым можно без потерь в том чилсе кодировать (разумеется место жрёт вагон), но нужно если ты потом видосик сам пожмёшь наиболее качественным кодеком и выложишь напрямую уже его. Так к чему это я, ffplay его корректно показывает, а всё остальное что я видел (mplayer, vlc, mpv) показывают с артефактами и мигающими областями.

peregrine ★★★★★
()

оптимизированного

–disable-pthreads
–disable-x86asm
–disable-runtime-cpudetect
–enable-small

Поделил на ноль так поделил

anonymous
()
Вы не можете добавлять комментарии в эту тему. Тема перемещена в архив.