Como compilar o FFmpeg com libfdkaac em um único binário estático? [fechadas]

9

Meu objetivo é criar um único binário FFmpeg estático com suporte a libfdkaac e x264 para OSX e Linux. Primeiro, tentei criar um no OSX, sigo as instruções na web do FFmpeg: https://trac.ffmpeg.org/wiki/CompilationGuide/MacOSX

Aqui estão as definições de configuração que apliquei para criar um binário estático:

./configure pkg_config='pkg-config --static' --prefix=/usr/local --extra-version=ntd_20150126 --disable-shared --enable-static --enable-gpl --enable-pthreads --enable-nonfree --enable-fontconfig --enable-libfreetype --enable-libass --enable-libfdk-aac  --enable-libmp3lame --enable-libopus --enable-libtheora --enable-libvorbis --enable-libvpx --enable-libx264 --enable-filters --enable-runtime-cpudetect

Após o processo de compilação, o FFmpeg fica em torno de 14Mb, ​​o que significa que não inclui as bibliotecas de terceiros. De fato, ele requer um link para bibliotecas dinâmicas localizadas em /usr/local/lib. Se eu removi essas bibliotecas dinâmicas, o FFmpeg mostrará um erro como:

dyld: Library not loaded: /usr/local/lib/libSDL-1.2.0.dylib
Referenced from: /usr/local/bin/ffmpeg
Reason: image not found
Trace/BPT trap: 5

É o caminho certo para transformar todas as bibliotecas externas em um único binário estático?

Eu ficaria muito grato por sua ajuda!

Ellis Shen
fonte
11
Eu finalmente descobri. A razão pela qual as bibliotecas dinâmicas ainda estão vinculadas é porque o processo de criação do ffmepg tem maior prioridade para usar a biblioteca dinâmica. Na verdade, criei bibliotecas dinâmicas e estáticas na pasta prefix e depois que removi todos os arquivos * .dylib da pasta prefix, o processo de criação pegou a biblioteca estática e construiu o binário único com êxito.
Ellis Shen
Considere responder sua própria pergunta para outras pessoas que estão tendo o mesmo problema.
Stib
O OS X não tem o lddcomando para mostrar as dependências da biblioteca dinâmica de um binário? Ou apenas um filecomando com saída que inclui se um binário estava vinculado estaticamente ou dinamicamente?
Peter Cordes
Além disso, yes --disable-shared --enable-staticdeve criar um binário estático. Eu acho que faz no Linux, ou quando a compilação cruzada para o Windows. Então parece que um bug nos scripts ffmpeg construir sobre OS X
Peter Cordes
Opa, estava apenas atualizando meu próprio FFmpeg (no GNU / Linux) e --enable-staticnão faz binários estáticos. Isso torna as libav*bibliotecas criadas pelo ffmpeg (e usadas pelos binários) estáticas ou não. Não faz o ffmpeg usar versões estáticas de bibliotecas externas. Então, o que você está vendo é o comportamento padrão do ffmpeg.
Peter Cordes

Respostas:

4

No meu CentOS 5.11 e FFmpeg 3.0, tenho que usar opções

--pkg-config-flags="--static"
--extra-cflags="-I$HOME/ffmpeg/include -static"
--extra-ldflags="-L$HOME/ffmpeg/lib -static"

--enable-static diz ao complier para criar as "bibliotecas estáticas" (libav * .a). Podemos combinar a API FFmpeg no outro aplicativo autônomo (estático).

--disable-shared diz ao complier para não criar as "bibliotecas de objetos compartilhados vinculadas dinamicamente" (libav * .so). Esse tipo de biblioteca pode ser carregado e usar a API FFmpeg pelo outro aplicativo.

Essas 2 opções não cumprem o FFmpeg como executável estático independente.

Boontawee Principal
fonte
9

Obrigado pela sugestão do stib. Deixo minha resposta aqui.

O processo de criação do FFmepg tem maior prioridade para usar a biblioteca dinâmica, mesmo se as bibliotecas estáticas estiverem prontas. Portanto, removi primeiro o suporte de algumas bibliotecas externas da configuração de compilação e verifique se todas as bibliotecas externas são apenas estáticas (remova * .dylib do prefixo / usr / local / lib). Em seguida, reconstrua-o com o seguinte comando:

./configure --pkg-config-flags="--static" --libdir=/usr/local/lib --extra-version=ntd_20150128 --disable-shared --enable-static --enable-gpl --enable-pthreads --enable-nonfree  --enable-libass --enable-libfdk-aac  --enable-libmp3lame  --enable-libx264 --enable-filters --enable-runtime-cpudetect

Lembre-se de definir --pkg-config-flags="--static", pedindo ao processo de compilação para usar a biblioteca estática. Então, obteremos um único binário FFmpeg executável!

PS: Eu removi o suporte ao libass da configuração, porque o libass depende do Fontconfig lib, que só tenho biblioteca dinâmica disponível. Vou colocar o suporte à libass de volta assim que descobrir como criar uma biblioteca estática do fontconfig.

Obrigado.

Ellis Shen
fonte
Então "--enable-static" não é necessário ?!
Dr.jacky
3
Acho --enable-estático ainda é necessária
Ellis Shen
11
Omg, você salvou minha vida. Eu estava trabalhando nessa questão por quase 2 semanas, pesquisando na Web por uma solução. E é isso. Obrigado !
precisa