Os melhores sinalizadores ffmpeg para garantir a portabilidade de um processo de mixagem e transcodificação

1

Eu sou o mantenedor de um software que usa ffmpeg para misturar automaticamente & transcodificar dois fluxos de entrada em uma única saída com um vídeo & faixa de áudio. Eu Estou enfrentando atualmente alguns problemas de portabilidade e gostaria de melhorar o meu uso de ffmpeg para garantir que meu aplicativo seja o mais portátil possível:

  • Funcionará em quase todos os sistemas operacionais & distro
  • Funcionará com versões antigas do ffmpeg (o debian squeeze ainda usa o ffmpeg 0.5.10)

Minha primeira fonte é um arquivo FLV ou mp4. Ele contém dois fluxos: áudio & vídeo. Eu não se importam com o vídeo, ele não está incluído no arquivo final.

A segunda fonte é uma lista de imagens PNG ou JPG. Eles serão usados para criar o fluxo de vídeo usando image2 .

A saída deve ser um arquivo com dois fluxos: audio & vídeo. Eu não tenho strong exigência em relação ao contêiner, o codec de áudio e o codec de vídeo. Eles só precisa estar facilmente disponível em qualquer sistema operacional / dispositivo. Eu quero preservar o áudio qualidade tanto quanto possível. O fluxo de vídeo é apenas um conjunto de slides estáticos. Seria ótimo minimizar o tamanho do arquivo de saída.

De acordo com esta descrição, quais flags / container / codecs você usaria?

A descrição do processo atual é a seguinte:

  1. Extraia a faixa de áudio da primeira fonte

    ffmpeg -v error -i source_1_path -vn -acodec libvorbis audio_track.ogg
    
  2. Crie o arquivo final

    ffmpeg -v error -f image2 -r 1 -i frame_pattern.jpg -i audio_track.ogg output.avi
    

Eu estava pensando que o ffmpeg usaria automaticamente o áudio / vídeo mais adequado codecs e amp; definições. Infelizmente ele falha em algumas distribuições Linux ( [ac3 @ 0x1e60380] invalid bit rate com 0.8.6-6:0.8.6-0ubuntu0.12.10.1 para exemplo).

Obviamente, seria melhor fazê-lo em um único passo, em vez de criar um faixa de áudio temporária.

    
por Clément MATHIEU 18.04.2013 / 16:39

1 resposta

2

ffmpeg versões e empacotamento ffmpeg você mesmo

Se alguém estiver usando ffmpeg 0.5.10, você realmente não é culpado se algo não funcionar. A causa número um dos problemas com os comandos ffmpeg (pelo menos da minha experiência) é uma versão desatualizada. Entre 0,5 e 1,2 recentes, existem literalmente milhares de erros fixos e centenas de novos recursos. Mais notavelmente, eles alteraram (e removeram) algumas opções de linha de comando, que quebram alguns fluxos de trabalho.

Observe que o Ubuntu, devido em algumas circunstâncias , realmente não usa ffmpeg do projeto FFmpeg, mas na verdade usa o avconv do Libav. Nas versões mais recentes do Ubuntu, isso é. Versões antigas do Ubuntu ainda forneciam um binário chamado ffmpeg que vinha do Libav, que está quebrado e desatualizado, mas as pessoas ainda pensam que ele vem do FFmpeg. Conclusão: Você não pode e não deve confiar em seu usuário para ter um binário ffmpeg em funcionamento em seu sistema.

Existem muitos projetos que incluem parte das ferramentas do FFmpeg , e você pode incorporar uma compilação estática com o seu software, se não for um problema legal (IANAL, portanto, verifique). A única desvantagem que vejo aqui é que os kernels mais antigos podem não executar todas as compilações estáticas.

Dito tudo, eis o que deve funcionar em todos os lugares, supondo que ffmpeg foi compilado com libx264 e libmp3lame ativado. O comando original que você tinha não funcionaria de forma confiável porque o áudio do Vorbis é problemático em AVI , e o codificador AC3 que é auto- selecionado para AVI pode chocke em algumas entradas. Além disso, você recodificaria seu áudio de Vorbis para AC3, o que deteriora a qualidade.

Extrair áudio para MP3

Em vez disso, exporte para o áudio de MP3, por ex. com 320 kBit / s CBR ou VBR de 4 (LAME% equivalente -V ). O último pode não funcionar em versões antigas devido ao sufixo :a .

ffmpeg -v error -i source_1_path -vn -acodec libmp3lame -ab 320k audio_track.mp3
ffmpeg -v error -i source_1_path -vn -acodec libmp3lame -q:a 4 audio_track.mp3

Combinar com vídeo H.264

Para combinar, usaremos o vídeo x264 (um codificador H.264):

ffmpeg -v error -f image2 -r 1 -i frame_pattern.jpg -i audio_track.mp3 \
-acodec copy -vcodec libx264 output.mp4

Aqui, você simplesmente copia o fluxo de áudio em vez de ter ffmpeg recodificado. Isso ajudará você a manter a qualidade original.

Quanto ao vídeo, note que nem todos os dispositivos podem reproduzir H.264 fora da caixa. Alguns podem reproduzir apenas o H.264 com o perfil de linha de base, que você define com -profile:v baseline no mais recente ffmpeg ou -vprofile baseline em algumas versões em torno de 0,7 (não sei qual… estava indocumentado) ou -vpre baseline para versões realmente antigas que usavam predefinições internas em vez de dependerem do x264 biblioteca de codificadores.

Alternativa: Combine com vídeo MPEG-4

Se o H.264 não for uma opção, você pode experimentar o vídeo MPEG-4 Parte II - aqui com uma taxa de bits de 2 MBit / s definida em -vb :

ffmpeg -v error -f image2 -r 1 -i frame_pattern.jpg -i audio_track.mp3 \
-acodec copy -vcodec mpeg4 -vb 2M output.mp4

A opção deve ser -b:v agora, mas o antigo alias ainda funciona.

    
por 18.04.2013 / 17:01