FFMPEG控制延迟和循环生成APNG
FFMPEG control delay and looping for generating APNG
我有一个(随机选择的)JPG 图像,我想用它来使用 ffmpeg 制作成 APNG 动画(以测试该过程)。它们都是相同的尺寸 (256x256)。但我似乎无法获得正确的语法来控制帧延迟和循环控制(永远循环)。从一系列图像创建 APNG 时,是否可以使用 ffmpeg 设置这些参数?如果是这样,有人可以提供正确的语法 and/or show an example command 吗?我搜索了 ffmpeg 文档,但似乎找不到相关语法。
我可以执行以下操作,但它不会接受-delay 和-loop。我使用 Imagemagick 来传输图像。
这有效,但不会循环,而且运行速度非常快。
magick lena.jpg mandril3.jpg monet2.jpg zelda1.jpg PNG:- | ffmpeg -i - x.apng
这给出了有关延迟 and/or 循环的错误:
magick lena.jpg mandril3.jpg monet2.jpg zelda1.jpg PNG:- | ffmpeg -i - -delay 1000 -loop -1 x.apng
我也很想知道是否可以在不使用 ImageMagick 的情况下直接在 ffmpeg 中指定一系列图像作为输入。
抱歉,我是ffmpeg的新手。我正在使用 ffmpeg 4.2.1.
循环播放
您可以使用 -plays
输出选项设置循环。 0
是无限循环,1
是不循环,2
会播放两次等等
-plays
是一个特定的选项(更多示例也称为 private option) for the APNG muxer. You can see private options for a specific muxer with ffmpeg -h muxer=apng
. See What are all codecs and formats supported by FFmpeg?。
APNG 的另一个私有选项是 -final_delay
以在最后一帧之后强制延迟。接受以秒为单位的值。
向 ffmpeg 提供图像
图像分离器
最常用的方法是使用image demuxer。
它接受一个编号序列,例如 image_001.png
、image_002.png
等:
ffmpeg -framerate 3 -i image_%03d.png -plays 0 output.apng
或 glob(至少在 Linux 和 macOS 上):
ffmpeg -framerate 1 -pattern_type glob -i "*.png" output.apng
使用 -framerate
输入选项设置 delay/timing,如上例所示。这是图像分离器的私有选项。
管道
您可以像在问题中那样将图像传送到 ffmpeg
。可以与其他工具结合使用以提供您喜欢的顺序。
例如,使用 sort
有助于您的图像系列使用 natural/version 编号,例如 1.png
、2.png
、...、10.png
、等等。否则 ffmpeg
会将它们排序为 1.png
、10.png
、2.png
.
cat $(find . -name '*.png' -print | sort -V) | ffmpeg -framerate 1 -i - -plays 1 output.apng
Concat 分离器
或者如果您想提供文件列表,请使用 concat demuxer。每张图片都可以有自己的持续时间。
创建 input.txt
包含:
file 'lena.jpg'
duration 1
file 'mandril3.jpg'
duration 0.5
file 'monet2.jpg'
duration 3
file 'zelda1.jpg'
duration 2
持续时间值以秒为单位。
连接:
ffmpeg -f concat -i input.txt -plays 0 output.apng
如果您省略 duration
,并希望在图像之间使用偶数 delay/timing,您可以使用 -r
输入选项。此示例将以每秒 1 帧的速度播放。
ffmpeg -r 1 -f concat -i input.txt -plays 0 output.apng
我有一个(随机选择的)JPG 图像,我想用它来使用 ffmpeg 制作成 APNG 动画(以测试该过程)。它们都是相同的尺寸 (256x256)。但我似乎无法获得正确的语法来控制帧延迟和循环控制(永远循环)。从一系列图像创建 APNG 时,是否可以使用 ffmpeg 设置这些参数?如果是这样,有人可以提供正确的语法 and/or show an example command 吗?我搜索了 ffmpeg 文档,但似乎找不到相关语法。
我可以执行以下操作,但它不会接受-delay 和-loop。我使用 Imagemagick 来传输图像。
这有效,但不会循环,而且运行速度非常快。
magick lena.jpg mandril3.jpg monet2.jpg zelda1.jpg PNG:- | ffmpeg -i - x.apng
这给出了有关延迟 and/or 循环的错误:
magick lena.jpg mandril3.jpg monet2.jpg zelda1.jpg PNG:- | ffmpeg -i - -delay 1000 -loop -1 x.apng
我也很想知道是否可以在不使用 ImageMagick 的情况下直接在 ffmpeg 中指定一系列图像作为输入。
抱歉,我是ffmpeg的新手。我正在使用 ffmpeg 4.2.1.
循环播放
您可以使用 -plays
输出选项设置循环。 0
是无限循环,1
是不循环,2
会播放两次等等
-plays
是一个特定的选项(更多示例也称为 private option) for the APNG muxer. You can see private options for a specific muxer with ffmpeg -h muxer=apng
. See What are all codecs and formats supported by FFmpeg?。
APNG 的另一个私有选项是 -final_delay
以在最后一帧之后强制延迟。接受以秒为单位的值。
向 ffmpeg 提供图像
图像分离器
最常用的方法是使用image demuxer。
它接受一个编号序列,例如 image_001.png
、image_002.png
等:
ffmpeg -framerate 3 -i image_%03d.png -plays 0 output.apng
或 glob(至少在 Linux 和 macOS 上):
ffmpeg -framerate 1 -pattern_type glob -i "*.png" output.apng
使用 -framerate
输入选项设置 delay/timing,如上例所示。这是图像分离器的私有选项。
管道
您可以像在问题中那样将图像传送到 ffmpeg
。可以与其他工具结合使用以提供您喜欢的顺序。
例如,使用 sort
有助于您的图像系列使用 natural/version 编号,例如 1.png
、2.png
、...、10.png
、等等。否则 ffmpeg
会将它们排序为 1.png
、10.png
、2.png
.
cat $(find . -name '*.png' -print | sort -V) | ffmpeg -framerate 1 -i - -plays 1 output.apng
Concat 分离器
或者如果您想提供文件列表,请使用 concat demuxer。每张图片都可以有自己的持续时间。
创建
input.txt
包含:file 'lena.jpg' duration 1 file 'mandril3.jpg' duration 0.5 file 'monet2.jpg' duration 3 file 'zelda1.jpg' duration 2
持续时间值以秒为单位。
连接:
ffmpeg -f concat -i input.txt -plays 0 output.apng
如果您省略 duration
,并希望在图像之间使用偶数 delay/timing,您可以使用 -r
输入选项。此示例将以每秒 1 帧的速度播放。
ffmpeg -r 1 -f concat -i input.txt -plays 0 output.apng