Digamos que tengo un archivo mp3 de 1 minuto de duración. Y tengo 20 imágenes png. Quiero combinar estas imágenes y un audio en un archivo de video, pero no quiero que cada imagen dure 3 segundos en la pantalla, quiero que algunas imágenes duren 5 segundos, otras 1 segundo, etc.
La única forma en que puedo pensar es simplemente copiar las imágenes que deberían durar más tiempo, por ejemplo, para que image1, image2, image3 sean exactamente iguales, esto me da 3 veces más tiempo en video.
Sin embargo, esto consume mucho tiempo y espacio. ¿Hay algún interruptor / parámetro en ffmpeg que me permita hacer eso?
Respuestas:
Usando ffmpeg 2.0 hay un par de formas de hacer esto:
Un método es usar tiempos de modificación de archivos. Primero configure el tiempo de modificación de los archivos de imagen para que cada archivo de imagen tenga un tiempo de modificación mayor que el anterior; La diferencia horaria es la duración de la imagen anterior (con una resolución de 1 segundo). Luego use la opción image2 demuxer
-ts_from_file 1
. Por ejemplo:Otro método es usar el
concat
demuxer , que toma una lista de archivos para concatenar, con duraciones opcionales. Primero cree un archivo que enumere sus imágenes y duraciones que tenga este aspecto:Luego proporcione este archivo como entrada para ffmpeg. Por ejemplo:
Es posible que deba duplicar el último archivo después de la duración final.
-c:a copy
copia el audio mp3 tal como está; si desea convertirlo a otro códec de audio, puede especificarlo en lugar decopy
. También es posible que desee especificar un códec de video diferente con-c:v
un formato de píxel diferente-pix_fmt
, como-c:v libx264 -pix_fmt yuv420p
.-vf fps=25
hará que la velocidad de cuadros de salida sea de 25 fps. Si su audio es más largo y desea que se corte después de las imágenes, use la-shortest
opción.fuente
-c:v libx264 -profile:v baseline -pix_fmt yuv420p out.mp4
lugar de out.avi, o pruebe con un reproductor diferente como mpv o ffplay. También asegúrese de estar utilizando una versión actual de FFmpeg y duplique el último nombre de archivo de imagen después de la duración final.Asumiendo
ffmpeg -i in.ffconcat -vf fps=25 out.avi
(2018: contenido del archivo in.ffconcat): esto funciona:
mientras esto no
es decir, en el segundo caso
ffprobe out.avi -show_entries format=duration -v 0
fuente