loglevels - Combina video y audio con ffmpeg. Repite el video mientras el audio no termina
ffmpeg resize video (3)
Estoy tratando de combinar un archivo de audio con un archivo de video. Tengo dos opciones:
Tenga un archivo de video muy pequeño (por ejemplo, 10 segundos) que se repite mientras el archivo de audio no termina.
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 el audio haya terminado.
He estado usando este último con la opción -t de ffmpeg. Significa que tengo que obtener la duración del archivo de audio para introducirlo en ffmpeg. ¿Es posible evitar este paso?
¿Algún puntero para la primera solución?
El segundo punto fue resuelto fácilmente usando la opción -shortest de ffmpeg. Consulte: http://www.ffmpeg.org/ffmpeg-doc.html#SEC12 para obtener más detalles.
para el primero, intente ffmpeg -i yourmovie.mp4 -loop 10
para enlazar la entrada 10 veces
Para el primer punto de bala no veo un comando directo. Lo que sugiero es usar ffprobe
para calcular la duración de ambos archivos y la cantidad de bucles de video que se deben reproducir 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 hacer un bucle del 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 la cantidad de veces que el video necesita ser en bucle. En lugar de -shortest
puede usar -t
ya que ya ha calculado la duración del audio.
A continuación se encuentra 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!