2

我有一个 JPG 图像(随机选择),我想使用 ffmpeg 制作成 APNG 动画(以测试过程)。它们都是相同的尺寸 (256x256)。但我似乎无法获得正确的语法来控制帧延迟和循环控制(永远循环)。从一系列图像创建 APNG 时,是否可以使用 ffmpeg 设置这些参数?如果是这样,有人可以提供正确的语法和/或显示示例命令吗?我搜索了 ffmpeg 文档,似乎找不到相关的语法。

我可以执行以下操作,但它不会接受 -delay 或 -loop。我使用 Imagemagick 来输入图像。

这有效,但不会循环,并且运行速度非常快。

magick lena.jpg mandril3.jpg monet2.jpg zelda1.jpg PNG:- | ffmpeg -i - x.apng

这给出了有关延迟和/或循环的错误:

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。

4

1 回答 1

4

循环播放

-plays您可以使用输出选项设置循环。0是无限的,1没有循环,2会播放两次,等等。

-plays是APNG 多路复用器的特定选项(又名私有选项)。您可以使用 . 查看特定多路复用器的私有选项ffmpeg -h muxer=apng。请参阅FFmpeg 支持的所有编解码器和格式是什么?更多示例。

APNG 的另一个私有选项是-final_delay在最后一帧之后强制延迟。接受以秒为单位的值。

向 ffmpeg 提供图像

图像分离器

最常用的方法是使用图像分离器

它接受一个编号序列,例如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如上例所示,使用输入选项设置延迟/定时。这是图像分离器的私有选项。

管道

您可以ffmpeg像在问题中那样通过管道传输图像。可以与其他工具结合使用,以提供您喜欢的顺序。

例如,使用sort有助于您的图像系列使用自然/版本编号,例如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 demuxer 。每个图像都可以有自己的持续时间。

  1. 创建input.txt包含:

    file 'lena.jpg'
    duration 1
    file 'mandril3.jpg'
    duration 0.5
    file 'monet2.jpg'
    duration 3
    file 'zelda1.jpg'
    duration 2
    

    持续时间值以秒为单位。

  2. 连接:

    ffmpeg -f concat -i input.txt -plays 0 output.apng
    

如果您省略duration,并且想要图像之间的延迟/时间均匀,您可以使用-r输入选项。此示例将以每秒 1 帧的速度播放。

ffmpeg -r 1 -f concat -i input.txt -plays 0 output.apng

另请参阅FFmpeg Wiki:连接

于 2020-09-23T18:23:24.967 回答