以 ffmpeg -i %04d.png 模式重复图像
Repeating images in a ffmpeg -i %04d.png pattern
我正在以 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 相同.
问题:生成 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
问题:在使用 -i images/%04d.png
时,有没有办法告诉 ffmpeg
忽略丢失的帧并使用最新的可用帧而不是失败?
如果不是,有什么替代方法可以仅使用这 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
方法二:concat demuxer
在 concat demuxer 输入文件列表中使用 duration
指令声明持续时间,然后使用连接分离器连接。
这可能是最快的方法。
使 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
方法三:trim过滤
此方法允许您以帧为单位声明持续时间(and/or 如果您愿意,可以使用时间值)。
使用 trim 过滤器 持续时间帧并与 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
你好,我昨天尝试了循环方法,我发现如果你有一个过时的cpu,编码视频可能比图像序列需要更长的时间。 (我也永远坏了我的笔记本电脑)。
我认为这是因为即使有 5 张图像,ffmpeg 也总是要读取 500 帧来对视频进行编码。
由于关注的是编码效率,请阅读此编码指南
https://trac.ffmpeg.org/wiki/Encode/H.264
回到你的代码。 -framerate 默认为 25,无需声明
ffmpeg -y -f image2 -pattern_type sequence -i images/%04d.png -c:v h264 -crf 51 -preset 'ultrafast' out.mp4
声明“-f image2 -pattern_type sequence”理论上应该节省探测文件的时间。
-crf 和预设是编码面包和黄油,该代码应该以低质量为代价为您提供最快的编码时间,请尝试并逐渐降低值,直到达到可接受的质量。
最后但同样重要的是,减慢编码速度的是您使用的格式:PNG 使用 256x256x256 色的巨大色彩空间,它们可以解压缩 (1file=30mb)。
如果您不需要 alpha 通道,请尝试使用 jpegs,速度会快得多。
我正在以 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 相同.
问题:生成 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
问题:在使用 -i images/%04d.png
时,有没有办法告诉 ffmpeg
忽略丢失的帧并使用最新的可用帧而不是失败?
如果不是,有什么替代方法可以仅使用这 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
方法二:concat demuxer
在 concat demuxer 输入文件列表中使用 duration
指令声明持续时间,然后使用连接分离器连接。
这可能是最快的方法。
使
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
方法三:trim过滤
此方法允许您以帧为单位声明持续时间(and/or 如果您愿意,可以使用时间值)。
使用 trim 过滤器 持续时间帧并与 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
你好,我昨天尝试了循环方法,我发现如果你有一个过时的cpu,编码视频可能比图像序列需要更长的时间。 (我也永远坏了我的笔记本电脑)。 我认为这是因为即使有 5 张图像,ffmpeg 也总是要读取 500 帧来对视频进行编码。 由于关注的是编码效率,请阅读此编码指南 https://trac.ffmpeg.org/wiki/Encode/H.264 回到你的代码。 -framerate 默认为 25,无需声明
ffmpeg -y -f image2 -pattern_type sequence -i images/%04d.png -c:v h264 -crf 51 -preset 'ultrafast' out.mp4
声明“-f image2 -pattern_type sequence”理论上应该节省探测文件的时间。
-crf 和预设是编码面包和黄油,该代码应该以低质量为代价为您提供最快的编码时间,请尝试并逐渐降低值,直到达到可接受的质量。
最后但同样重要的是,减慢编码速度的是您使用的格式:PNG 使用 256x256x256 色的巨大色彩空间,它们可以解压缩 (1file=30mb)。 如果您不需要 alpha 通道,请尝试使用 jpegs,速度会快得多。