具有不同持续时间的 FFMPEG 图像序列

具有不同持续时间的 FFMPEG 图像序列

假设我有一个 1 分钟长的 mp3 文件。我有 20 张 png 图像。我想将这些图像和音频合并成一个视频文件,但我不希望每张图像在屏幕上持续 3 秒,我希望一些图像持续 5 秒,其他图像持续 1 秒等。

我能想到的唯一方法就是复制应该持续更长时间的图像,例如让图像 1、图像 2、图像 3 完全相同,这使我的视频时间增加 3 倍。

但是这非常耗时和耗空间。ffmpeg 中是否有任何开关/参数允许我这样做?

答案1

使用 ffmpeg 2.0 有几种方法可以做到这一点:

  1. 一种方法是使用文件修改时间。首先设置修改时间图像文件,使每个图像文件的修改时间都大于前一个图像文件的修改时间;时间差是前一个图像的持续时间(分辨率为 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
    
  2. 另一种方法是使用concat解复用器,它接受要连接的文件列表,并带有可选的持续时间。首先创建一个列出您的图像和持续时间的文件,如下所示:

    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

答案2

假设 ffmpeg -i in.ffconcat -vf fps=25 out.avi

(2018:in.ffconcat 文件内容)-这有效:

ffconcat 版本 1.0
文件文本.png
持续时间 30.0
文件文本.png

虽然这没有

ffconcat 版本 1.0
文件文本.png
持续时间 30.0

即第二种情况

ffprobe out.avi -show_entries format=duration -v 0

[格式]
持续时间=0.040000
[/格式]

相关内容