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.
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?
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.
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.