Video 以ffmpeg-i%04d.png模式重复图像

Video 以ffmpeg-i%04d.png模式重复图像,video,ffmpeg,Video,Ffmpeg,我正在以FPS=25的速度制作一个20秒的视频,500帧是0000.png,0001.png,…,0499.png。这项工作: ffmpeg -framerate 25 -i images/%04d.png out.mp4 但事实上,视频中只有一些变化,在我的例子中是0000帧、0122帧、0288帧、0312帧、0450帧。同时,PNG是相同的 问题:当只有5个不同的文件就足够时,生成500个PNG文件总是很慢!我想只生成这5个PNG文件,并从中生成视频 当我尝试上面的命令时,images/

我正在以FPS=25的速度制作一个20秒的视频,500帧是
0000.png
0001.png
,…,
0499.png
。这项工作:

ffmpeg -framerate 25 -i images/%04d.png out.mp4
但事实上,视频中只有一些变化,在我的例子中是0000帧、0122帧、0288帧、0312帧、0450帧。同时,PNG是相同的

问题:当只有5个不同的文件就足够时,生成500个PNG文件总是很慢!我想只生成这5个PNG文件,并从中生成视频

当我尝试上面的命令时,
images/
仅包含
0000.png
0122.png
0288.png
0312.png
0450.png
,而不是495个其他的,显然它失败了:

[image2@0000000000 6D4040]无法打开文件:images/0001.png

问题:在使用
-i images/%04d.png
时,是否有方法告诉
ffmpeg
忽略缺失的帧,并使用最新的可用帧而不是失败?

如果没有,有什么替代方法可以仅使用这5个PNG生成视频,并在精确的时间范围内生成视频?

方法1:concat过滤器 使用
-t
输入选项声明持续时间,然后使用连接

方法2:concat解复用器 在输入文件列表中使用
duration
指令声明持续时间,然后使用concat解复用器连接

这可能是最快的方法

  • 制作包含以下内容的
    input.txt

    file 0000.png
    duration 4.88
    file 0122.png
    duration 6.64
    file 0288.png
    duration 0.96
    file 0312.png
    duration 5.52
    
  • 连接:

    ffmpeg -f concat -i input.txt -vf format=yuv420p output.mp4
    
  • 方法3:微调过滤器 此方法允许您以帧(和/或使用时间值(如果愿意)的形式声明持续时间

    使用帧作为持续时间和连接的示例:


    您好,我昨天尝试了循环方法,我发现如果您有过时的cpu,编码视频可能比编码图像序列需要更长的时间。(我也把我的笔记本电脑摔坏了)。 我认为这是因为即使有5幅图像,ffmpeg也总是要读取500帧来编码视频。 由于关注的是编码效率,请阅读本编码指南 然后回到你的代码。默认情况下,-framerate是25,您不需要声明它

    ffmpeg-y-f image2-pattern_type sequence-i images/%04d.png-c:v h264-crf 51-预设“超快”输出。mp4

    从理论上讲,“-f image2-pattern_type sequence”的声明应该可以节省探测文件的时间

    -crf和PRESET是编码的基本要素,该代码应该以低质量为代价为您提供最快的编码时间,尝试该方法并逐渐减小值,直到达到可接受的质量

    最后但并非最不重要的一点是编码速度减慢的是您使用的格式:PNG使用256x256x256颜色的巨大颜色空间,它们可以被解压缩(1文件=30mb)。
    如果您不需要alpha通道,请尝试使用JPEG,速度会快得多。

    是否所有图像都显示相同的持续时间(例如每幅1秒),还是任意显示?例如,0000表示5秒,0122或2秒,等等@llogan的持续时间不同。0000应该在122帧期间保持,然后0122.png应该保持到第288帧,所以它应该保持288-122=166帧,等等。您知道哪些帧是唯一的,每个帧应该显示多长时间吗?或者这是一个全自动的要求吗?是的,我提前知道哪些帧是唯一的@llogan,所以我只需要在122帧中显示0000.png,在122到287帧中显示0122.png,在接下来的帧中显示0288.png等等。非常感谢@llogan,我将尝试所有这些!PS:最终,我会将这500帧(来自这些PNG文件)与其他视频(使用
    叠加
    过滤复合
    )混合/叠加,如
    测试.mp4
    ,从第250帧开始,直到第600帧。这三种方法是否都与此覆盖兼容?@Basj它们都与覆盖兼容。谢谢!出于好奇,您为什么专门使用
    format=yuv420p
    ?指定YUV颜色空间是否重要?如果我们不提及它并保留默认值,它会不如yuv420p好吗?PS@llogan:以防万一你有主意(还有时间看一下),我在设置覆盖顺序方面有一个棘手的问题:@Basj ffmpeg试图保持色度完整性,但不是所有玩家都能处理结果,因此,当使用
    format=yuv420p
    从图像到MP4时,可确保兼容的色度子采样。
    ffmpeg -f concat -i input.txt -vf format=yuv420p output.mp4
    
    ffmpeg -loop 1 -framerate 25 -i 0000.png -loop 1 -framerate 25 -i 0122.png -loop 1 -framerate 25 -i 0288.png -loop 1 -framerate 25 -i 0312.png -filter_complex "[0]trim=start_frame=0:end_frame=121,setpts=PTS-STARTPTS[v0];[1]trim=start_frame=122:end_frame=287,setpts=PTS-STARTPTS[v1];[2]trim=start_frame=288:end_frame=311,setpts=PTS-STARTPTS[v2];[3]trim=start_frame=312:end_frame=449,setpts=PTS-STARTPTS[v3];[v0][v1][v2][v3]concat=n=4:v=1:a=0,format=yuv420p" output.mp4