ffmpeg adiciona áudio, mas mantém a duração do vídeo a mesma (não a mais curta)


12

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

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

No entanto, isso estende o arquivo de vídeo de saída para que seja o comprimento do arquivo de áudio, se for maior que o vídeo. O uso de -shortest reduz o arquivo de vídeo se ele for menor que o vídeo. Então, existe um sinalizador para dizer ao ffmpeg para cortar a duração do vídeo de saída para o comprimento do vídeo de entrada?


Por favor, selecione uma resposta correta. O único verdadeiro correto é o de @Zurechtweiser.
Roel Van de Paar

Respostas:


13

Acredito que você pode alcançar o objetivo desejado usando a opção -filter_complex e a opção apad filter para extrair o áudio com 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

Isso pressupõe que o áudio que você deseja esteja no primeiro fluxo do 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 1º fluxo da 2ª entrada ou audiofile.wav acima).

Detalhes em: https://www.ffmpeg.org/ffmpeg-filters.html#Examples-68


Você deve mencionar, que as -filter_complexforças de opção reencodar - é, por exemplo, possível executar ffmpeg -i videofile.mp4 -i audiofile.wav -c:v copy output.mp4, mas nãoffmpeg -i videofile.mp4 -i audiofile.wav -filter_complex " [1:0] apad " -c:v copy -shortest output.mp4
Eugen Rieck

Esta é a resposta oposta do que é solicitado. O OP pede para finalizar o vídeo quando o áudio terminar, a resposta dada é adicionar silêncio de áudio se o áudio for menor que o vídeo. Esta resposta está incorreta.
Roel Van de Paar

Não é "o oposto" do que o OP solicitou. Os OPs desejam que o vídeo de saída tenha a duração do vídeo de entrada, independentemente da duração da faixa de áudio. Minha resposta aborda a circunstância em que o vídeo de entrada é mais longo que o arquivo de áudio. O OP já possui uma solução para quando o vídeo de entrada é mais curto que o arquivo de áudio, que deve ser usado com o menor valor.
deadcode

12
  • Se a duração do vídeo for menor que a duração do áudio, -shortesté o que você deseja.
  • Se a duração do vídeo for maior que a duração do áudio, nenhum sinalizador será o desejado.

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

EDITAR

Inspirado pela resposta do @ deadcode, preciso deixar claro que "nenhum sinalizador para automatizar" obviamente não é verdadeiro, se você estiver disposto a recodificar : nesse caso, siga apadas sugestões do @deadcode.

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

Existe uma solução alternativa usando o ffconcatdesmuxador, mas ele precisa de um pouco de trabalho:

  • crie um arquivo que contenha silêncio exatamente no mesmo formato do seu arquivo de áudio ("silence.wav")
  • crie um arquivo concat "audio.ffconcat" (com tantas linhas de silêncio quanto necessário para garantir que o áudio seja longo o suficiente):

.

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

Isso sintetizará o apadfiltro sem um gráfico de filtro, permitindo assim um mux sem recodificação.


@RoelVandePaar Como eu disse: se a duração do vídeo for menor que a duração do áudio -shortest, use esta solução alternativa se você quiser adicionar silêncio sem recodificar.
Eugen Rieck

Correto, perdi isso na revisão. Entrada removida. Sinta-se livre para fazer o mesmo.
Roel Van de Paar

5

Se você souber o tamanho do seu arquivo de vídeo, poderá fazer isso usando

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

Onde 43 é a duração do seu arquivo de vídeo em segundos.


a pergunta do autor deseja repetir o arquivo de áudio enquanto o vídeo não terminou. Isso funciona para isso?
Rafael Sanches

@RafaelSanches Não, ele não faz.
precisa saber é o seguinte

O autor não deseja repetir o áudio. Essa resposta também é a única correta que faz o que o OP estava pedindo; finalize o vídeo quando o vídeo de entrada terminar.
Roel Van de Paar
Ao utilizar nosso site, você reconhece que leu e compreendeu nossa Política de Cookies e nossa Política de Privacidade.
Licensed under cc by-sa 3.0 with attribution required.