我正在制作一个 20 秒的视频,FPS=25,500 帧,0000.png
, 0001.png
, ..., 0499.png
。这有效:
ffmpeg -framerate 25 -i images/%04d.png out.mp4
但事实上,视频中只有一些变化,在我的例子中,帧为 0000、0122、0288、0312、0450。同时,PNG 是相同的强>.
问题:生成 500 个 PNG 文件总是很慢,而只需 5 个不同的文件就足够了!我只想生成这 5 个 PNG 文件,并从它们生成视频。
当我使用 images/
尝试上面的命令时仅包含0000.png
, 0122.png
, 0288.png
, 0312.png
, 0450.png
而不是其他 495 个,显然它失败了:
[image2 @ 00000000006d4040] Could not open file : images/0001.png
问题:有没有办法告诉ffmpeg
使用-i images/%04d.png
时忽略丢失的帧并使用最新的可用帧而不是失败?
如果没有,有什么替代方案可以仅使用这 5 个 PNG 来生成应在精确时间范围内到达的视频?
最佳答案
方法一:concat过滤器
使用 -t
输入选项声明持续时间,然后与 concat filter 连接.
ffmpeg -loop 1 -framerate 25 -t 4.88 -i 0000.png -loop 1 -framerate 25 -t 6.64 -i 0122.png -loop 1 -framerate 25 -t 0.96 -i 0288.png -loop 1 -framerate 25 -t 00:00:05.52 -i 0312.png -filter_complex "[0][1][2][3]concat=n=4:v=1:a=0,format=yuv420p" output.mp4
方法2:concat demuxer
在 concat demuxer 中使用 duration
指令声明持续时间输入文件列表,然后使用 concat demuxer 连接。
这可能是最快的方法。
制作包含以下内容的
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:修剪滤镜
此方法允许您以帧为单位声明持续时间(和/或如果您愿意,可以使用时间值)。
使用 trim filter 持续时间的帧的示例并与 concat filter 连接:
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
关于video - 以 ffmpeg -i %04d.png 模式重复图像,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/66274201/