ffmpeg adiciona áudio, mas mantém o tamanho do vídeo igual (não mais curto)

8

Estou adicionando áudio a um arquivo de vídeo usando o ffmpeg assim

ffmpeg -i videofile.mp4 -i audiofile.wav output.mp4

No entanto, isso amplia o arquivo de vídeo de saída para ser o comprimento do arquivo de áudio, se for maior que o vídeo. Usando -shortest corta o arquivo de vídeo curto se o arquivo de áudio for menor que o vídeo. Então, há um sinalizador para dizer ao ffmpeg para cortar o tamanho do vídeo de saída até o tamanho do vídeo de entrada?

    
por stealthcopter 22.08.2014 / 14:18

3 respostas

11

Acredito que você pode alcançar seu objetivo desejado usando a opção -filter_complex e a opção de filtro apad para preencher seu áudio com o silêncio no final, se o vídeo for mais longo. Seu comando seria:

ffmpeg -i videofile.mp4 -i audiofile.wav -filter_complex " [1:0] apad " -shortest output.mp4

Isto assume que o áudio que você quer está no primeiro fluxo de audiofile.wav, a sintaxe [A: B] diz para pegar o fluxo B'th da entrada A'th (ambos começando com 0, então [1: 0] é o primeiro fluxo da segunda entrada, ou audiofile.wav acima).

Detalhes em: link

    
por 23.08.2014 / 06:39
7
  • Se a duração do vídeo for menor que o comprimento do áudio, -shortest é o que você deseja.
  • Se a duração do vídeo for maior que o comprimento do áudio, nenhum sinal será o que você deseja.

Não há sinalizador para automatizar essa decisão.

EDITAR

Inspirado na resposta do @ deadcode, preciso deixar claro que "nenhum sinalizador para automatizar" obviamente não é verdadeiro, se você estiver disposto a reencodificar : nesse caso, use apad como sugerido por @deadcode.

Se, no entanto, você quiser evitar a reencodificação (ou seja, -c:v copy ), a resposta permanece.

Há uma solução alternativa usando o ffconcat demuxer, mas precisa de um pouco de trabalho:

  • crie um arquivo contendo o silêncio em exatamente o mesmo formato que seu audiofile ("silence.wav")
  • crie um arquivo de concat "audio.ffconcat" (com tantas linhas de silêncio quantas forem necessárias para garantir que o áudio seja longo o suficiente):

.

file 'audiofile.wav'
file 'silence.wav'
file 'silence.wav'
...
file 'silence.wav'
  • executar ffmpeg -i videofile.mp4 -f concat -i audio.ffconcat -c:v copy output.mp4

Isso sintetizará o filtro apad sem um gráfico de filtro, permitindo assim um mux sem reencodificar.

    
por 22.08.2014 / 15:36
2

Se você souber a duração do seu arquivo de vídeo, poderá fazer isso usando

ffmpeg -i videofile.mp4 -i audiofile.wav -t 43 output.mp4

Em que 43 é o tamanho do seu arquivo de vídeo em segundos.

    
por 12.10.2016 / 07:20