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!


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.


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.


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
Ao utilizar nosso site, você reconhece que leu e compreendeu nossa Política de Cookies e nossa Política de Privacidade.
Licensed under cc by-sa 3.0 with attribution required.