redimensionar loglevels framerate con abort_on video audio ffmpeg

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?



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!