FFmpeg mapa fluxo opcional (áudio)

2

Eu uso este comando para produzir um arquivo dimensionado e com uma imagem de sobreposição:

ffmpeg 
-i input.* -i overlay.png 
-filter_complex "[0:v]...; ...[1:v]overlay=... ... [resultingvideo]" 
-map "[resultingvideo]" -vcodec libx264 -f mp4 
-acodec libmp3lame -q:a 50 
outputfilename.mov

em que "..." representa alguma filtragem excluída.

O problema é que não há áudio.

Se eu adicionar -map 0:a , haverá áudio se a entrada tiver áudio e um erro e nenhum arquivo de saída se a entrada não tiver áudio.

Como posso obter o ffmpeg para usar opcionalmente o áudio da entrada, se existir, e ignorar o áudio ou produzir silêncio ou algo assim?

Ou preciso analisar o arquivo primeiro usando o ffprobe antes de gerar meu comando de script?

    
por tomsv 15.05.2014 / 10:13

2 respostas

3

As versões recentes do ffmpeg suportam uma opção de mapeamento condicional :

ffmpeg -i input.mp4 -map 0:a? output.mp4

Isto irá ignorar fluxos de áudio não existentes no arquivo de entrada.

    
por 25.04.2017 / 14:41
0

Se você estiver disposto a executar o ffmpeg duas vezes, primeiro poderá fazer a sobreposição e, em seguida, fazer um segundo comando para copiar esse vídeo e codificar o áudio do original. Se o áudio não existir, o ffmpeg irá reclamar e fazer qualquer coisa. Se estiver feliz, você recebe o áudio e o vídeo.

Seria algo como isto.

ffmpeg -i input.* -i overlay.png -filter_complex "[0:v]...; ...[1:v]overlay=... ... [resultingvideo]" -map "[resultingvideo]" -vcodec libx264 -f mp4 outputfilenameJustVideo.mov

seguido por

ffmpeg -y -i outputfilenameJustVideo.mov -i input.*
-acodec libmp3lame -q:a 50 -c:v copy -map 0:v -map 1:a outputfilename.mov

Com o meu breve teste, o ffmpeg não queria criar / substituir nada quando não havia áudio e quando havia áudio.

Para ser claro, isso é um hack. Você provavelmente gostaria de ter alguma lógica para renomear o produto final para o que você queria.

Eu não sei de um método simples de comando.

    
por 19.06.2014 / 21:06