2011-02-16 18 views
16

Estoy intentando fusionar un archivo de audio con un archivo de video. que tienen dos opciones:Combina video y audio con ffmpeg. Pasa el video en bucle mientras el audio no supera el

  • tener un archivo de vídeo muy pequeña (por ejemplo, 10 segundos) que el bucle mientras que el archivo de audio no ha terminado.

  • Tengo un archivo de video muy largo (más largo que cualquiera de mis archivos de audio) en el que puedo adjuntar el archivo de audio. Me gustaría cortar el video cuando termine el audio.

He utilizado este último con la opción -t de ffmpeg. Significa que tengo que obtener la duración del archivo de audio para alimentarlo en ffmpeg. ¿Es posible evitar este paso?

¿Algún puntero para la primera solución?

Respuesta

-2

para el primero, tratar ffmpeg -i yourmovie.mp4 -loop 10 al bucle de la entrada 10 veces

+4

-loop_input está en desuso, utilice -loop 1 Tenga en cuenta que las dos opciones de bucle solo funcionan con -f image2 – puchu

+1

no se puede obtener -loop 10 ni -loop 1 para que funcione. Estoy intentando reproducir un video de mp4 (3 minutos) a audio de 2 horas de duración. – Sun

-1

Para el primer punto, no veo una orden directa. Lo que sugiero es usar ffprobe para calcular la duración de ambos archivos y calcular la cantidad de loops de video que deben reproducirse durante la duración del audio.

A continuación se obtendrá la duración de las entradas.

ffprobe -i input_media -show_entries format=duration -v quiet -of csv="p=0" 

Luego puede recorrer el video manualmente hasta que satisfaga el valor calculado de las instancias de video.

ffmpeg -i input_audio -f concat -i <(for i in {1..n}; do printf "file '%s'\n" input_video; done) -c:v copy -c:a copy -shortest output_video 

1..n representa el número de veces que tenga que ser colocado el video. En lugar de -shortest puede usar -t ya que ya ha calculado la duración del audio.

A continuación se muestra el script de shell asociado.

#!/bin/bash 
audio_duration=$(ffprobe -i ${1} -show_entries format=duration -v quiet -of csv="p=0") 
video_duration=$(ffprobe -i ${2} -show_entries format=duration -v quiet -of csv="p=0") 
n_loops=$(echo "(${audio_duration}/${video_duration}) + 1"|bc) 
ffmpeg -i ${1} -f concat -i <(for i in {1..${n_loops}}; do printf "file '%s'\n" ${2}; done) -c:v copy -c:a copy -shortest ${3} 

Para Windows, puede convertir este script de shell en un script por lotes.

Más información:

Espero que esto ayude!

+0

¡Gracias! Lamentablemente, no creo que pueda usar este script de shell en Windows. ¿Tendría una versión de Windows? – Basj

+0

Lo siento. No tengo una pc funcionando en Windows. Aún puede seguir el enlace actualizado en la respuesta. – Chamath

Cuestiones relacionadas