ffmpeg agrega audio pero mantiene la duración del video igual (no más corto)


12

Estoy agregando audio a un archivo de video usando ffmpeg así

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

Sin embargo, esto extiende el archivo de video de salida a la longitud del archivo de audio si es más largo que el video. El uso de -shortest corta el archivo de video si el archivo de audio es más corto que el video. Entonces, ¿hay una bandera que le diga a ffmpeg que corte la longitud del video de salida a la longitud del video de entrada?


Por favor seleccione una respuesta correcta. El único verdadero correcto es el de @Zurechtweiser.
Roel Van de Paar

Respuestas:


13

Creo que puede lograr su objetivo deseado utilizando la opción -filter_complex y la opción de filtro apad para rellenar su audio con silencio al final si el video es más largo. Su comando sería:

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

Esto supone que el audio que desea está en la primera secuencia de audiofile.wav, la sintaxis [A: B] dice que tome la secuencia B'th de la entrada A'th (ambas comenzando con 0, entonces [1: 0] es la primera transmisión desde la segunda entrada, o audiofile.wav arriba).

Detalles en: https://www.ffmpeg.org/ffmpeg-filters.html#Examples-68


Debe mencionar que la -filter_complexopción obliga a volver a codificar, por ejemplo, es posible ejecutar, ffmpeg -i videofile.mp4 -i audiofile.wav -c:v copy output.mp4pero noffmpeg -i videofile.mp4 -i audiofile.wav -filter_complex " [1:0] apad " -c:v copy -shortest output.mp4
Eugen Rieck

Esta es la respuesta opuesta a lo que se solicita. OP pide finalizar el video cuando finaliza el audio, la respuesta dada es agregar silencio de audio si el audio es más corto que el video. Esta respuesta es incorrecta.
Roel Van de Paar

No es "lo contrario" de lo que solicitó el OP. Los OP quieren que el video de salida sea la duración del video de entrada, independientemente de la duración de la pista de audio. Mi respuesta aborda la circunstancia en que el video de entrada es más largo que el archivo de audio. El OP ya tiene una solución para cuando el video de entrada es más corto que el archivo de audio, que es usar -shortest.
código muerto

12
  • Si la duración del video es menor que la duración del audio, -shortestes lo que desea.
  • Si la duración del video es más larga que la duración del audio, ninguna marca será lo que desee.

No hay bandera para automatizar esta decisión.

EDITAR

Inspirado por la respuesta de @ deadcode, necesito aclarar que "ninguna bandera para automatizar", por supuesto, no es cierto, si está dispuesto a volver a codificar : en este caso, siga las apadsugerencias de @deadcode.

Sin embargo, si desea evitar volver a codificar (es decir -c:v copy), la respuesta se mantiene.

Hay una solución alternativa para usar el ffconcatdemuxer, pero necesita un poco de trabajo:

  • cree un archivo que contenga silencio exactamente en el mismo formato que su archivo de audio ("silence.wav")
  • cree un archivo concat "audio.ffconcat" (con tantas líneas de silencio como necesite para asegurarse de que su audio sea lo suficientemente largo):

.

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

Esto sintetizará el apadfiltro sin un gráfico de filtro, permitiendo así un mux sin volver a codificar.


@RoelVandePaar Como dije: si la duración del video es más corta que la duración del audio -shortest, use esta solución alternativa si desea agregar silencio sin volver a codificar.
Eugen Rieck

Correcto, perdí eso en la revisión. Entrada eliminada. Siéntase libre de hacer lo mismo.
Roel Van de Paar

5

Si conoce la longitud de su archivo de video, puede lograrlo usando

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

Donde 43 es la longitud de su archivo de video en segundos.


la pregunta del autor quiere repetir el archivo de audio mientras el video no ha terminado. ¿Esto funciona para eso?
Rafael Sanches

@RafaelSanches No, no lo hace.
Zurechtweiser

El autor no quiere repetir el audio. Esta respuesta también es la única correcta que hace lo que pedía el OP; finalice el video cuando finalice el video de entrada.
Roel Van de Paar
Al usar nuestro sitio, usted reconoce que ha leído y comprende nuestra Política de Cookies y Política de Privacidad.
Licensed under cc by-sa 3.0 with attribution required.