假设我有一个1分钟长的mp3文件。我有20个png图像。我想将这些图像和音频合并到一个视频文件中,但是我不希望每个图像在屏幕上持续3秒,我希望某些图像持续5秒,其他图像持续1秒,等等。
我能想到的唯一方法就是复制应该持续更多时间的图像,例如使image1,image2,image3完全相同,这使我在视频中的停留时间增加了3倍。
然而,这是非常耗时和占用空间的。ffmpeg中是否有任何开关/参数允许我这样做?
假设我有一个1分钟长的mp3文件。我有20个png图像。我想将这些图像和音频合并到一个视频文件中,但是我不希望每个图像在屏幕上持续3秒,我希望某些图像持续5秒,其他图像持续1秒,等等。
我能想到的唯一方法就是复制应该持续更多时间的图像,例如使image1,image2,image3完全相同,这使我在视频中的停留时间增加了3倍。
然而,这是非常耗时和占用空间的。ffmpeg中是否有任何开关/参数允许我这样做?
Answers:
使用ffmpeg 2.0,有两种方法可以做到这一点:
一种方法是使用文件修改时间。首先设置图像文件的修改时间,以使每个图像文件的修改时间都大于之前的修改时间。时间差是上一张图片的持续时间(分辨率为1秒)。然后使用image2 demuxer选项-ts_from_file 1
。例如:
touch -t 01010000.00 image01.png
touch -t 01010000.03 image02.png
touch -t 01010000.08 image03.png
...
ffmpeg -ts_from_file 1 -i image%2d.png -i audio.mp3 -c:a copy -vf fps=25 out.avi
另一种方法是使用concat
demuxer,它使用要连接的文件列表,并带有可选的持续时间。首先创建一个文件,列出您的图像和持续时间,如下所示:
ffconcat version 1.0
file image01.png
duration 3
file image02.png
duration 5
file image03.png
然后将此文件作为ffmpeg的输入。例如:
ffmpeg -i in.ffconcat -i audio.mp3 -c:a copy -vf fps=25 out.avi
在最后期限之后,您可能需要复制最后一个文件。 -c:a copy
照原样复制mp3音频;如果要将其转换为另一个音频编解码器,则可以指定而不是copy
。您可能还希望使用来指定其他视频编解码器-c:v
或来指定像素格式-pix_fmt
,例如-c:v libx264 -pix_fmt yuv420p
。 -vf fps=25
将使输出帧速率为25 fps。如果音频较长,并且您希望在图像后将其切断,请使用该-shortest
选项。
-c:v libx264 -profile:v baseline -pix_fmt yuv420p out.mp4
而不是out.avi,或尝试使用其他播放器,例如mpv或ffplay。另外,请确保您使用的是FFmpeg的当前版本,并在最后期限后复制最后一个图像文件名。