Existen situaciones en las que se requiere crear un video con diapositivas o episodios con una duración predeterminada a partir de un archivo de audio, como en el caso de algún webinar, entrevista o podcast. En este caso vamos a utilizar la aplicación ffmpeg
desde linea de comando para primero crear el video y después agregarle el audio previamente grabado.
Para crear el video con las imágenes, primero se tiene que crear un archivo con el “path” de las imágenes, que para este caso se requieren archivos .png
junto con la duración (en segundos) de cada una de ellas.
files.txt
file 'chapters/0.png'
duration 456
file 'chapters/1.png'
duration 816
file 'chapters/2.png'
duration 544
file 'chapters/3.png'
duration 564
file 'chapters/4.png'
duration 668
file 'chapters/5.png'
duration 622
file 'chapters/6.png'
duration 414
file 'chapters/7.png'
duration 250
file 'chapters/8.png'
duration 238
file 'chapters/9.png'
duration 110
file 'chapters/10.png'
duration 1027
file 'chapters/11.png'
duration 119
file 'chapters/0.png'
duration 628
En este ejemplo utilizo el archivo 0.png
para empezar y para finalizar el video.
En caso de tener los archivos en otro formato, como por ejemplo .jpg
, en macOS existe una utilería (sips
) para transformar archivo de imágenes.
for i in *.jpg; do sips -s format png "${i}" --out "${i%jpg}png"; done
Es un poco complicado sacar la duración en segundos a partir de un timestamp en formato 00:00:00
, por el momento una tabla en cualquier aplicación de hoja de cálculo puede ayudar a este proceso.
Una vez con estos datos y el archivo (en este caso) files.txt
se ejecuta el siguiente comando para crear el video sin audio:
ffmpeg -f concat -i files.txt -vsync vfr -pix_fmt yuv420p noaudio.mp4
Luego se agregar el audio con el siguiente comando:
ffmpeg -i noaudio.mp4 -i audio.mp3 -c:a aac final.mp4
Hasta el momento desconozco si se puede realizar esta operación en un solo comando o existe una forma más sencilla (con menos pasos) para crear este tipo de videos, pero por ahora es la solución que tengo disponible, ffmpeg
es una utileria con demasiadas opciones que me es complicado entender bien como acomodar todo en menos pasos e incluso si existe una mejor opción.
Fuente: ffmpeg wiki
Actualización: Encontré que la utilería ffprobe
(parte de la “suite” de FFmpeg) puede mostrar el tiempo en segundos de los archivos mp3 que contienen episodios (“chapters”), lo cual hace más fácil encontrar la duración de cada episodio con el siguiente comando:
ffprobe -i audio.mp3 -print_format json -show_chapters