具有各种持续时间的 FFMPEG 图像序列

Flo*_*011 20 video ffmpeg images

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

我能想到的唯一方法就是复制应该持续更长时间的图像,例如让 image1、image2、image3 完全相同,这给了我 3 倍的视频时间。

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

mar*_*k4o 27

使用 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
    
    Run Code Online (Sandbox Code Playgroud)
  2. 另一种方法是使用concatdemuxer,它需要一个文件列表来连接,并具有可选的持续时间。首先创建一个文件,列出您的图像和持续时间,如下所示:

    ffconcat version 1.0
    file image01.png
    duration 3
    file image02.png
    duration 5
    file image03.png
    
    Run Code Online (Sandbox Code Playgroud)

    然后将此文件作为输入提供给 ffmpeg。例如:

    ffmpeg -i in.ffconcat -i audio.mp3 -c:a copy -vf fps=25 out.avi
    
    Run Code Online (Sandbox Code Playgroud)

您可能需要在最终持续时间之后复制最后一个文件。 -c:a copy按原样复制 mp3 音频;如果要将其转换为其他音频编解码器,则可以指定它而不是copy. 您可能还想使用 指定不同的视频编解码器-c:v或使用 指定不同的像素格式-pix_fmt,例如-c:v libx264 -pix_fmt yuv420p. -vf fps=25将使输出帧速率为 25 fps。如果您的音频较长并且您希望它在图像之后被切断,请使用该-shortest选项。