Video 以ffmpeg-i%04d.png模式重复图像
我正在以FPS=25的速度制作一个20秒的视频,500帧是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/
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
您好,我昨天尝试了循环方法,我发现如果您有过时的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