【问题标题】:FFMPEG control delay and looping for generating APNGFFMPEG 控制延迟和循环生成 APNG
【发布时间】:2021-01-09 07:03:02
【问题描述】:

我有一个 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。

【问题讨论】:

  • 弗雷德,部分答案在这里...stackoverflow.com/a/43797017/2836621
  • 你可以像这样trac.ffmpeg.org/wiki/How%20to%20speed%20up%20/… 设置延迟,但我没有任何可以测试的东西。
  • 谢谢Mark。 -plays 用于控制循环。但是第二个链接没有提供使用setpts 进行延迟的有效方法。
  • 如果您想循环播放,则无法通过管道传输图像*。在trac.ffmpeg.org/wiki/Slideshow#Concatdemuxer 使用解复用器方法。 *从技术上讲,你可以,但它会消耗内存。
  • @Gyan 谢谢,但这不是我想要的。但是您的链接确实告诉我如何处理延迟 - 使用输入帧速率。那行得通。

标签: animation ffmpeg imagemagick apng


【解决方案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

或者一个 glob(至少在 Linux 和 macOS 上):

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

如上例所示,使用-framerate 输入选项设置延迟/定时。这是图像分离器的私有选项。

管道

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

例如,使用sort 有助于您的图像系列使用自然/版本编号,例如1.png2.png、...、10.png 等。否则ffmpeg 会将它们排序为@987654345 @、10.png2.png

cat $(find . -name '*.png' -print | sort -V) | ffmpeg -framerate 1 -i - -plays 1 output.apng

Concat 解复用器

如果您想提供文件列表,请使用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: Concatenate

【讨论】:

  • @llogan谢谢。 -framerate 是我想要的。我自己也发现了,就在你发帖之前。关于输入文件规范,如何在不使用通配符或管道的情况下提供图像列表,尤其是在名称和后缀不同的情况下。 ffmpeg 会以某种方式允许文件列表吗?
  • @fmw42 另一种选择是 Gyan 提到的 concat demuxer。查看更新的答案。
  • 感谢大家的帮助。我想我有我需要使用 -framerate 和 -plays 的东西。
  • 关于使用图像输入的信息的好页面是trac.ffmpeg.org/wiki/Slideshow
猜你喜欢
  • 2017-10-03
  • 1970-01-01
  • 1970-01-01
  • 2016-08-18
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2019-05-26
相关资源
最近更新 更多