FFMPEG控制延迟和循环以生成APNG

问题描述

我有一个随机选择的)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。

解决方法

循环

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

-plays是APNG多路复用器的特定于选项(也称为private option)。您可以使用ffmpeg -h muxer=apng查看特定复用器的私有选项。有关更多示例,请参见What are all codecs and formats supported by FFmpeg?

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

为ffmpeg提供图像

图像解复用器

最常见的方法是使用image demuxer

它接受编号序列,例如image_001.pngimage_002.png等:

ffmpeg -framerate 3 -i image_%03d.png -plays 0 output.apng

或全局(至少在Linux和macOS上):

ffmpeg -framerate 1 -pattern_type glob -i "*.png" output.apng

使用-framerate输入选项设置延迟/定时,如上面的示例所示。这是图像多路分配器的专用选项。

管道

您可以像在问题中一样将图像通过管道传输到ffmpeg。可以与其他工具结合使用以提供您喜欢的订单。

例如,使用sort有助于您的图像系列使用自然/版本编号,例如1.png2.png,...,10.png等。否则,{ {1}}会将其排序为ffmpeg1.png10.png

2.png

Concat分离器

或者如果要提供文件列表,请使用concat demuxer。每个图像可以有自己的持续时间。

  1. 创建包含以下内容的cat $(find . -name '*.png' -print | sort -V) | ffmpeg -framerate 1 -i - -plays 1 output.apng

    input.txt

    持续时间值以秒为单位。

  2. 连接:

    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输入选项。此示例将以每秒1帧的速度播放。

-r

另请参阅FFmpeg Wiki: Concatenate