FFmpeg FAQ (perguntas frequentes)
1 Perguntas gerais
1.1 Por que o FFmpeg não é compatível com o recurso [xyz]?
Porque ainda ninguém assumiu essa tarefa. O desenvolvimento do FFmpeg é conduzido pelas tarefas que são importantes para cada desenvolvedor individualmente. Se houver um recurso que seja importante para você, a melhor forma de conseguir que ele seja implementado é assumir a tarefa você mesmo ou patrocinar um desenvolvedor.
1.2 O FFmpeg não é compatível com o codec XXX. Vocês podem incluir um carregador de DLL do Windows para viabilizar o suporte?
Não. As DLLs do Windows não são portáveis, são volumosas e muitas vezes lentas. Além disso, o FFmpeg se esforça para ser compatível com todos os codecs nativamente. Um carregador de DLL não contribui para esse objetivo.
1.3 Não consigo ler este arquivo, embora o ffmpeg pareça ser compatível com este formato.
Mesmo que o ffmpeg consiga ler o formato container, pode ser que ele não seja compatível com todos os seus codecs. Consulte a lista de codecs compatíveis na documentação do ffmpeg.
1.4 Quais codecs são compatíveis com o Windows?
O Windows não é muito compatível com formatos padrão como o MPEG, a menos que você instale alguns codecs adicionais.
A lista de codecs de vídeo a seguir deve funcionar na maioria dos sistemas Windows:
msmpeg4v2
.avi/.asf
msmpeg4
somente .asf
wmv1
somente .asf
wmv2
somente .asf
mpeg4
Somente se você tiver algum codec MPEG-4 instalado, como ffdshow ou Xvid.
mpeg1video
somente .mpg
Observe que, no Windows, os arquivos ASF costumam ter extensão .wmv ou .wma. Vale mencionar também que a Microsoft reivindica uma patente sobre o formato ASF e pode processar ou ameaçar usuários que criem arquivos ASF com software que não seja da Microsoft. Recomenda-se fortemente evitar o ASF sempre que possível.
A lista de codecs de áudio a seguir deve funcionar na maioria dos sistemas Windows:
adpcm_ima_wav adpcm_ms pcm_s16le
sempre
libmp3lame
Se algum codec MP3, como o LAME, estiver instalado.
2 Compilação
2.1 error: can't find a register in class 'GENERAL_REGS' while reloading 'asm'
Isso é um bug do gcc. Não nos relate esse bug. Em vez disso, relate-o aos desenvolvedores do gcc. Observe que não vamos adicionar soluções alternativas para bugs do gcc.
Observe também que (alguns d)os desenvolvedores do gcc acreditam que isso não é um bug, ou não é um bug que devam corrigir: https://gcc.gnu.org/bugzilla/show_bug.cgi?id=11203. Por outro lado, alguns deles não sabem a diferença entre um problema indecidível e um problema NP-difícil...
2.2 Instalei esta biblioteca com o gerenciador de pacotes da minha distribuição. Por que o configure não a detecta?
As distribuições costumam dividir as bibliotecas em vários pacotes. O pacote principal contém os arquivos necessários para executar programas que usam a biblioteca. O pacote de desenvolvimento contém os arquivos necessários para compilar programas que usam a biblioteca. Às vezes, a documentação e/ou os dados também ficam em um pacote separado.
Para compilar o FFmpeg, você precisa instalar o pacote de desenvolvimento. Costuma se chamar libfoo-dev ou libfoo-devel. Você pode removê-lo depois que a compilação terminar, mas certifique-se de manter o pacote principal.
2.3 Como faço para o pkg-config encontrar minhas bibliotecas?
Em algum lugar junto com suas bibliotecas, há um arquivo .pc (ou vários) em um diretório pkgconfig. Você precisa definir variáveis de ambiente para indicar ao pkg-config onde estão esses arquivos.
Se você precisar adicionar diretórios à lista de busca do pkg-config (caso típico: biblioteca instalada separadamente), adicione-o a $PKG_CONFIG_PATH:
export PKG_CONFIG_PATH=/opt/x264/lib/pkgconfig:/opt/opus/lib/pkgconfig
Se você precisar substituir a lista de busca do pkg-config (caso típico: compilação cruzada), defina-a em $PKG_CONFIG_LIBDIR:
export PKG_CONFIG_LIBDIR=/home/me/cross/usr/lib/pkgconfig:/home/me/cross/usr/local/lib/pkgconfig
Se você precisar conhecer as dependências internas da biblioteca (uso típico: vinculação estática), adicione a opção --static ao pkg-config:
./configure --pkg-config-flags=--static
2.4 Como uso o pkg-config ao fazer compilação cruzada?
A melhor forma é instalar o pkg-config no seu ambiente de compilação cruzada. Assim, ele usará automaticamente as bibliotecas de compilação cruzada.
Você também pode usar o pkg-config do ambiente host especificando explicitamente --pkg-config=pkg-config para o configure. Nesse caso, você precisa apontar o pkg-config para os diretórios corretos usando PKG_CONFIG_LIBDIR, conforme explicado no item anterior.
Como solução intermediária, você pode colocar no seu ambiente de compilação cruzada um script que chame o pkg-config do host com PKG_CONFIG_LIBDIR definido. O script pode ser assim:
#!/bin/sh
PKG_CONFIG_LIBDIR=/path/to/cross/lib/pkgconfig
export PKG_CONFIG_LIBDIR
exec /usr/bin/pkg-config "$@"
3 Uso
3.1 O ffmpeg não funciona; o que está errado?
Tente executar make distclean no diretório-fonte do ffmpeg antes da compilação. Se isso não ajudar, veja (https://ffmpeg.org/bugreports.html).
3.2 Como codifico imagens avulsas em vídeos?
Primeiro, renomeie suas imagens para seguir uma sequência numérica. Por exemplo, img1.jpg, img2.jpg, img3.jpg,... Depois você pode executar:
ffmpeg -f image2 -i img%d.jpg /tmp/a.mpg
Observe que ‘%d’ é substituído pelo número da imagem.
img%03d.jpg significa a sequência img001.jpg, img002.jpg, etc.
Use a opção -start_number para declarar um número inicial para a sequência. Isso é útil se a sua sequência não começar em img001.jpg, mas ainda estiver em ordem numérica. O exemplo a seguir começará em img100.jpg:
ffmpeg -f image2 -start_number 100 -i img%d.jpg /tmp/a.mpg
Se você tiver um grande número de imagens para renomear, pode usar o comando a seguir para aliviar o trabalho. O comando, usando a sintaxe do shell bourne, cria links simbólicos de todos os arquivos no diretório atual que correspondem a *jpg para o diretório /tmp na sequência img001.jpg, img002.jpg e assim por diante.
x=1; for i in *jpg; do counter=$(printf %03d $x); ln -s "$i" /tmp/img"$counter".jpg; x=$(($x+1)); done
Se você quiser ordená-las pela data de modificação mais antiga primeiro, substitua *jpg por $(ls -r -t *jpg).
Depois, execute:
ffmpeg -f image2 -i /tmp/img%03d.jpg /tmp/a.mpg
A mesma lógica se aplica a qualquer formato de imagem que o ffmpeg leia.
Você também pode usar cat para enviar imagens ao ffmpeg por meio de pipe:
cat *.jpg | ffmpeg -f image2pipe -c:v mjpeg -i - output.mpg
3.3 Como codifico um vídeo em imagens avulsas?
Use:
ffmpeg -i movie.mpg movie%d.jpg
O movie.mpg usado como entrada será convertido em movie1.jpg, movie2.jpg, etc...
Em vez de confiar no autorreconhecimento do formato do arquivo, você também pode usar
-c:v ppm -c:v png -c:v mjpeg
para forçar a codificação.
Aplicando isso ao exemplo anterior:
ffmpeg -i movie.mpg -f image2 -c:v mjpeg menu%d.jpg
Tenha em mente que não existe um codec "jpeg". Use "mjpeg" em vez disso.
3.4 Por que vejo uma leve degradação de qualidade na codificação multithread de MPEG*?
Na codificação multithread de MPEG*, os slices codificados precisam ser independentes; caso contrário, a thread n praticamente teria que esperar a thread n-1 terminar, então é bem lógico que haja uma pequena redução de qualidade. Isso não é um bug.
3.5 Como posso ler da entrada padrão ou escrever na saída padrão?
Use - como nome de arquivo.
3.6 -f jpeg não funciona.
Tente ’-f image2 test%d.jpg’.
3.7 Por que não consigo mudar a taxa de quadros?
Alguns codecs, como o MPEG-1/2, permitem apenas um pequeno número de taxas de quadros fixas. Escolha um codec diferente com a opção de linha de comando -c:v.
3.8 Como codifico vídeo Xvid ou DivX com o ffmpeg?
Tanto o Xvid quanto o DivX (versão 4 em diante) são implementações do padrão ISO MPEG-4 (observe que há muitos outros formatos de codificação que usam esse mesmo padrão). Portanto, use ’-c:v mpeg4’ para codificar nesses formatos. O fourcc padrão armazenado em um arquivo codificado em MPEG-4 será ’FMP4’. Se você quiser um fourcc diferente, use a opção ’-vtag’. Por exemplo, ’-vtag xvid’ fará com que o fourcc ’xvid’ seja armazenado como o fourcc de vídeo em vez do padrão.
3.9 Quais são bons parâmetros para codificar MPEG-4 de alta qualidade?
’-mbd rd -flags +mv4+aic -trellis 2 -cmp 2 -subcmp 2 -g 300 -pass 1/2’, coisas para experimentar: ’-bf 2’, ’-mpv_flags qp_rd’, ’-mpv_flags mv0’, ’-mpv_flags skip_rd’.
3.10 Quais são bons parâmetros para codificar MPEG-1/MPEG-2 de alta qualidade?
’-mbd rd -trellis 2 -cmp 2 -subcmp 2 -g 100 -pass 1/2’, mas cuidado: ’-g 100’ pode causar problemas com alguns decoders. Coisas para experimentar: ’-bf 2’, ’-mpv_flags qp_rd’, ’-mpv_flags mv0’, ’-mpv_flags skip_rd’.
3.11 O vídeo entrelaçado fica muito ruim ao ser codificado com o ffmpeg; o que está errado?
Use ’-flags +ilme+ildct’ e talvez ’-flags +alt’ para material entrelaçado, e experimente ’-top 0/1’ se o resultado ficar muito bagunçado.
3.12 Como posso ler arquivos DirectShow?
Se você compilou o FFmpeg com ./configure --enable-avisynth (possível apenas em plataformas MinGW/Cygwin), poderá usar como entrada qualquer arquivo que o DirectShow consiga ler.
Basta criar um arquivo de texto "input.avs" com esta única linha ...
DirectShowSource("C:\path to your file\yourfile.asf")
... e depois entregue esse arquivo de texto ao ffmpeg:
ffmpeg -i input.avs
Para QUALQUER outra ajuda sobre o AviSynth, visite a página do AviSynth.
3.13 Como posso unir arquivos de vídeo?
"Unir" arquivos de vídeo é algo bastante ambíguo. A lista a seguir explica os diferentes tipos de "união" e mostra como cada um é tratado no FFmpeg. Unir arquivos de vídeo pode significar:
- Colocá-los um atrás do outro: isso é chamado de concatenar (resumidamente: concat) e é tratado neste próprio FAQ.
- Colocá-los juntos no mesmo arquivo, para que o usuário escolha entre as diferentes versões (exemplo: idiomas de áudio diferentes): isso é chamado de multiplexar (resumidamente: mux), e é feito simplesmente invocando o ffmpeg com várias opções -i.
- Para áudio, colocar todos os canais juntos em um único fluxo (exemplo: dois fluxos mono em um fluxo estéreo): às vezes isso é chamado de mesclar (merge), e pode ser feito usando o filtro
amerge. - Para áudio, reproduzir um sobre o outro: isso é chamado de misturar (mix), e pode ser feito primeiro mesclando-os em um único fluxo e depois usando o filtro
panpara misturar os canais como desejar. - Para vídeo, exibir os dois juntos, lado a lado ou um sobre parte do outro; pode ser feito usando o filtro de vídeo
overlay.
3.14 Como posso concatenar arquivos de vídeo?
Há várias soluções, dependendo das circunstâncias exatas.
3.14.1 Concatenar usando o filtro concat
O FFmpeg tem um filtro concat projetado especificamente para isso, com exemplos na documentação. Essa operação é recomendada se você precisar recodificar.
3.14.2 Concatenar usando o demuxer concat
O FFmpeg tem um demuxer concat que você pode usar quando quiser evitar uma recodificação e seu formato não for compatível com concatenação em nível de arquivo.
3.14.3 Concatenar usando o protocolo concat (em nível de arquivo)
O FFmpeg tem um protocolo concat projetado especificamente para isso, com exemplos na documentação.
Alguns containers multimídia (MPEG-1, MPEG-2 PS, DV) permitem concatenar vídeo apenas concatenando os arquivos que os contêm.
Assim, você pode concatenar seus arquivos multimídia primeiro transcodificando-os para esses formatos privilegiados, depois usando o humilde comando cat (ou o igualmente humilde copy no Windows) e, por fim, transcodificando de volta para o formato de sua escolha.
ffmpeg -i input1.avi -qscale:v 1 intermediate1.mpg
ffmpeg -i input2.avi -qscale:v 1 intermediate2.mpg
cat intermediate1.mpg intermediate2.mpg > intermediate_all.mpg
ffmpeg -i intermediate_all.mpg -qscale:v 2 output.avi
Além disso, você pode usar o protocolo concat em vez de cat ou copy, o que evita a criação de um arquivo intermediário potencialmente enorme.
ffmpeg -i input1.avi -qscale:v 1 intermediate1.mpg
ffmpeg -i input2.avi -qscale:v 1 intermediate2.mpg
ffmpeg -i concat:"intermediate1.mpg|intermediate2.mpg" -c copy intermediate_all.mpg
ffmpeg -i intermediate_all.mpg -qscale:v 2 output.avi
Observe que talvez seja necessário fazer escape do caractere "|", que tem significado especial em muitos shells.
Outra opção é usar pipes nomeados, caso sua plataforma seja compatível:
mkfifo intermediate1.mpg
mkfifo intermediate2.mpg
ffmpeg -i input1.avi -qscale:v 1 -y intermediate1.mpg < /dev/null &
ffmpeg -i input2.avi -qscale:v 1 -y intermediate2.mpg < /dev/null &
cat intermediate1.mpg intermediate2.mpg |\
ffmpeg -f mpeg -i - -c:v mpeg4 -c:a libmp3lame output.avi
3.14.4 Concatenar usando áudio e vídeo raw
Da mesma forma, o formato yuv4mpegpipe e os codecs raw video e raw audio também permitem concatenação, e a etapa de transcodificação é quase sem perdas. Ao usar vários yuv4mpegpipe, a primeira linha precisa ser descartada de todos os fluxos, exceto o primeiro. Isso pode ser feito redirecionando por meio de tail, como mostrado a seguir. Observe que, ao redirecionar por tail, é preciso usar o agrupamento de comandos, { ;}, para colocar em segundo plano corretamente.
Por exemplo, digamos que queremos concatenar dois arquivos FLV em um arquivo output.flv:
mkfifo temp1.a
mkfifo temp1.v
mkfifo temp2.a
mkfifo temp2.v
mkfifo all.a
mkfifo all.v
ffmpeg -i input1.flv -vn -f u16le -c:a pcm_s16le -ac 2 -ar 44100 - > temp1.a < /dev/null &
ffmpeg -i input2.flv -vn -f u16le -c:a pcm_s16le -ac 2 -ar 44100 - > temp2.a < /dev/null &
ffmpeg -i input1.flv -an -f yuv4mpegpipe - > temp1.v < /dev/null &
{ ffmpeg -i input2.flv -an -f yuv4mpegpipe - < /dev/null | tail -n +2 > temp2.v ; } &
cat temp1.a temp2.a > all.a &
cat temp1.v temp2.v > all.v &
ffmpeg -f u16le -c:a pcm_s16le -ac 2 -ar 44100 -i all.a \
-f yuv4mpegpipe -i all.v \
-y output.flv
rm temp[12].[av] all.[av]
3.15 Ao usar -f lavfi, o áudio fica mono sem motivo aparente.
Use -dumpgraph - para descobrir exatamente onde o layout de canais é perdido.
É bem provável que seja por causa do auto-inserted aresample. Tente entender por que o filtro de conversão foi necessário naquele ponto.
Um lugar provável é logo antes da saída, já que -f lavfi atualmente só é compatível com S16 empacotado (packed).
Em seguida, insira o aformat correto explicitamente no filtergraph, especificando o formato exato.
aformat=sample_fmts=s16:channel_layouts=stereo
3.16 Por que o FFmpeg não vê as legendas do meu arquivo VOB?
O VOB e alguns outros formatos não têm um cabeçalho global que descreva tudo o que está presente no arquivo. Em vez disso, espera-se que os aplicativos façam uma varredura no arquivo para descobrir o que ele contém. Como os arquivos VOB costumam ser grandes, apenas o início é varrido. Se as legendas aparecerem somente mais adiante no arquivo, elas não serão detectadas inicialmente.
Alguns aplicativos, incluindo a ferramenta de linha de comando ffmpeg, só conseguem trabalhar com fluxos detectados durante a varredura inicial; fluxos detectados posteriormente são ignorados.
O tamanho da varredura inicial é controlado por duas opções: probesize (padrão ~5 Mo) e analyzeduration (padrão 5,000,000 µs = 5 s). Para que o fluxo de legendas seja detectado, os dois valores precisam ser grandes o suficiente.
3.17 Por que a opção -sameq do ffmpeg foi removida? O que usar no lugar?
A opção -sameq significava "same quantizer" (mesmo quantizador) e só fazia sentido em um conjunto bem limitado de casos. Infelizmente, muita gente a confundia com "same quality" (mesma qualidade) e a usava em situações em que não fazia sentido: o efeito visível era, grosso modo, o esperado, mas obtido de um jeito bem ineficiente.
Cada encoder tem seu próprio conjunto de opções para ajustar o equilíbrio entre qualidade e tamanho; use as opções do encoder que estiver usando para definir o nível de qualidade em um ponto aceitável para o seu gosto. As opções mais comuns para isso são -qscale e -qmax, mas você deveria consultar a documentação do encoder escolhido.
3.18 Tenho um vídeo esticado, por que o redimensionamento não corrige isso?
Muitos codecs e formatos de vídeo conseguem armazenar a proporção de aspecto do vídeo: essa é a razão entre a largura e a altura, seja da imagem completa (DAR, display aspect ratio), seja de pixels individuais (SAR, sample aspect ratio). Por exemplo, telas EGA com resolução 640×350 tinham DAR 4:3 e SAR 35:48.
A maior parte do processamento de imagens estáticas trabalha com pixels quadrados, ou seja, SAR 1:1, mas muitos padrões de vídeo, especialmente os da era de transição do analógico para o digital, usam pixels não quadrados.
A maioria dos filtros de processamento do FFmpeg trata a proporção de aspecto para evitar que a imagem fique esticada: o recorte (cropping) ajusta o DAR para manter o SAR constante, e o redimensionamento ajusta o SAR para manter o DAR constante.
Se você quiser esticar, ou “unstretch”, a imagem, precisa sobrescrever essa informação com os setdar or setsar filters.
Não se esqueça de examinar cuidadosamente o vídeo original para verificar se o esticamento vem da própria imagem ou da informação de proporção de aspecto.
Por exemplo, para corrigir uma captura EGA mal codificada, use os comandos a seguir: o primeiro para ampliar para pixels quadrados, o segundo para definir a proporção de aspecto correta, ou o terceiro para evitar a transcodificação (pode não funcionar, dependendo do formato / codec / player / fase da lua):
ffmpeg -i ega_screen.nut -vf scale=640:480,setsar=1 ega_screen_scaled.nut
ffmpeg -i ega_screen.nut -vf setdar=4/3 ega_screen_anamorphic.nut
ffmpeg -i ega_screen.nut -aspect 4/3 -c copy ega_screen_overridden.nut
3.19 Como executo o ffmpeg como uma tarefa em segundo plano?
Durante suas operações, o ffmpeg normalmente verifica a entrada do console, à procura de entradas como "q" para parar e "?" para exibir ajuda. O ffmpeg não tem como detectar quando está sendo executado como uma tarefa em segundo plano. Ao verificar a entrada do console, isso pode fazer com que o processo que executa o ffmpeg em segundo plano seja suspenso.
Para evitar essas verificações de entrada e permitir que o ffmpeg seja executado como uma tarefa em segundo plano, use a opção -nostdin na chamada do ffmpeg. Isso funciona tanto se você executar o ffmpeg em um shell quanto se o invocar em seu próprio processo por meio de uma API do sistema operacional.
Como alternativa, quando estiver executando o ffmpeg em um shell, você pode redirecionar a entrada padrão para /dev/null (no Linux e no macOS) ou NUL (no Windows). Esse redirecionamento pode ser feito tanto na chamada do ffmpeg quanto em um script de shell que chame o ffmpeg.
Por exemplo:
ffmpeg -nostdin -i INPUT OUTPUT
ou (no Linux, macOS e outros shells do tipo UNIX):
ffmpeg -i INPUT OUTPUT </dev/null
ou (no Windows):
ffmpeg -i INPUT OUTPUT <NUL
3.20 Como evito que o ffmpeg seja suspenso com uma mensagem como suspended (tty output)?
Se você executar o ffmpeg em segundo plano, pode notar que o processo é suspenso. Pode aparecer uma mensagem como suspended (tty output). A questão é como evitar que o processo seja suspenso.
Por exemplo:
% ffmpeg -i INPUT OUTPUT &> ~/tmp/log.txt &
[1] 93352
%
[1] + suspended (tty output) ffmpeg -i INPUT OUTPUT &>
Apesar da mensagem "tty output", o problema aqui é que o ffmpeg normalmente verifica a entrada do console quando está em execução. O sistema operacional detecta isso e suspende o processo até que você possa trazê-lo para o primeiro plano e cuidar dele.
A solução é usar as técnicas corretas para dizer ao ffmpeg que não consulte a entrada do console. Você pode usar a opção -nostdin, ou redirecionar a entrada padrão com < /dev/null. Veja o FAQ Como executo o ffmpeg como uma tarefa em segundo plano? para mais detalhes.
4 Desenvolvimento
4.1 Há exemplos que mostram como usar as bibliotecas do FFmpeg, em especial libavcodec e libavformat?
Sim. Confira o diretório doc/examples no repositório-fonte, também disponível on-line em: https://github.com/FFmpeg/FFmpeg/tree/master/doc/examples.
Os exemplos também são instalados por padrão, geralmente em $PREFIX/share/ffmpeg/examples.
Você também pode ler o Developers Guide da documentação do FFmpeg. Como alternativa, examine o código-fonte de um dos muitos projetos de código aberto que já incorporam o FFmpeg, em (projects.html).
4.2 Vocês podem oferecer suporte ao meu compilador C XXX?
Depende. Se o seu compilador for compatível com C99, é provável que patches para viabilizar o suporte sejam bem-vindos, desde que não poluam o código-fonte com #ifdefs relacionados ao compilador.
4.3 O Microsoft Visual C++ é compatível?
Sim. Veja a seção Microsoft Visual C++ na documentação do FFmpeg.
4.4 Vocês podem adicionar suporte a automake, libtool ou autoconf?
Não. Essas ferramentas são pesadas demais e complicam a compilação.
4.5 Por que não reescrever o FFmpeg em C++ orientado a objetos?
O FFmpeg já é organizado de forma altamente modular e não precisa ser reescrito em uma linguagem formalmente orientada a objetos. Além disso, muitos dos desenvolvedores preferem C puro; e funciona bem para eles. Para mais argumentos sobre o assunto, leia "Programming Religion".
4.6 Por que os programas do ffmpeg não têm símbolos de depuração?
O processo de compilação cria ffmpeg_g, ffplay_g etc., que contêm todas as informações de depuração. Esses binários passam por strip para criar ffmpeg, ffplay etc. Se você precisar das informações de depuração, use as versões *_g.
4.7 Não gosto da LGPL; posso contribuir com código sob a GPL em vez disso?
Sim, desde que o código seja opcional e possa ser colocado de forma fácil e limpa sob #if CONFIG_GPL sem quebrar nada. Assim, por exemplo, um novo codec ou filtro seria aceitável sob GPL, enquanto uma correção de bug em código LGPL não seria.
4.8 Estou usando o FFmpeg no meu aplicativo C, mas o linker reclama de símbolos ausentes das próprias bibliotecas.
Por padrão, o FFmpeg compila bibliotecas estáticas. Em bibliotecas estáticas, as dependências não são tratadas. Isso tem duas consequências. Primeiro, você precisa especificar as bibliotecas na ordem de dependência: -lavdevice deve vir antes de -lavformat, -lavutil deve vir depois de tudo o mais etc. Segundo, as bibliotecas externas usadas pelo FFmpeg também precisam ser especificadas.
Uma forma fácil de obter a lista completa das bibliotecas necessárias na ordem de dependência é usar o pkg-config.
c99 -o program program.c $(pkg-config --cflags --libs libavformat libavcodec)
Veja doc/example/Makefile e doc/example/pc-uninstalled para mais detalhes.
4.9 Estou usando o FFmpeg no meu aplicativo C++, mas o linker reclama de símbolos ausentes que parecem estar disponíveis.
O FFmpeg é um projeto puramente em C; portanto, para usar as bibliotecas dentro do seu aplicativo C++, você precisa declarar explicitamente que está usando uma biblioteca C. Você pode fazer isso envolvendo seus includes do FFmpeg com extern "C".
Veja http://www.parashift.com/c++-faq-lite/mixing-c-and-cpp.html#faq-32.3
4.10 Estou usando o libavutil no meu aplicativo C++, mas o compilador reclama que ’UINT64_C’ não foi declarado nesse escopo
O FFmpeg é um projeto puramente em C que usa recursos matemáticos do C99; para viabilizar o uso deles em C++, você precisa acrescentar -D__STDC_CONSTANT_MACROS ao seu CXXFLAGS
4.11 Tenho um arquivo em memória / uma API diferente de open/read/ da libc; como uso isso com o libavformat?
Você precisa criar um AVIOContext personalizado usando avio_alloc_context; veja libavformat/aviobuf.c no FFmpeg e libmpdemux/demux_lavf.c no código-fonte do MPlayer ou MPlayer2.
4.12 Onde está a documentação sobre ffv1, msmpeg4, asv1, 4xm?
veja https://www.ffmpeg.org/~michael/
4.13 Como entrego H.263-RTP (e outros codecs em RTP) ao libavcodec?
Mesmo sendo peculiar por ser orientado a rede, o RTP é um container como qualquer outro. Você precisa fazer o demux do RTP antes de entregar o payload ao libavcodec. Nesse caso específico, consulte a RFC 4629 para ver como isso deve ser feito.
4.14 AVStream.r_frame_rate está errado, é muito maior que a taxa de quadros.
r_frame_rate NÃO é a taxa de quadros média; é a menor taxa de quadros capaz de representar com precisão todas as marcas de tempo. Portanto, não, não está errado se for maior que a média! Por exemplo, se você tiver conteúdo misto de 25 e 30 fps, r_frame_rate será 150 (o mínimo múltiplo comum). Se você estiver procurando a taxa de quadros média, veja AVStream.avg_frame_rate.
4.15 Por que make fate não executa todos os testes?
Certifique-se de ter as amostras do fate-suite e de que a variável de Make SAMPLES, a variável de ambiente FATE_SAMPLES ou a opção --samples do configure estejam definidas com o caminho correto.
4.16 Por que make fate não encontra as amostras?
Por acaso você tem um caractere ~ no caminho das amostras para indicar um diretório home? Esse valor é usado de formas que o shell não consegue expandir, o que faz o FATE não encontrar os arquivos. Basta substituir ~ pelo caminho completo.
Hospedagem fornecida por telepoint.bg