【问题标题】:How to create a video from a series of images with varying image durations?如何从具有不同图像持续时间的一系列图像创建视频?
【发布时间】:2012-12-07 19:12:07
【问题描述】:

我想以编程方式创建一个由一系列图像组成的视频文件。但是,我还希望能够为每个图像指定持续时间。我经常看到ffmpeg examples 建议用于类似的任务,但它们总是假设每个图像的持续时间相同。有没有一种有效的方法来实现这一点? (一个低效的解决方案可能是将帧速率设置为较高的值并重复复制每个图像,直到它与预期的持续时间相匹配)

我还将动态生成每个图像,因此如果有办法将图像数据编码为视频帧而不将每个图像写入磁盘,那就更好了。但是,这不是必需的。

编辑:要清楚,我不一定需要使用 ffmpeg。其他免费的命令行工具很好,视频处理库也很好。我只是在寻找一个好的解决方案。

【问题讨论】:

    标签: image video ffmpeg


    【解决方案1】:

    您可以使用 concat demuxer 手动排序图像并为每个图像提供特定的持续时间。

    ffmpeg -f concat -i input.txt -vsync vfr -pix_fmt yuv420p output.mp4
    

    您的 input.txt 应该如下所示。

    file '/path/to/dog.png'
    duration 5
    file '/path/to/cat.png'
    duration 1
    file '/path/to/rat.png'
    duration 3
    file '/path/to/tapeworm.png'
    duration 2
    file '/path/to/tapeworm.png'
    

    你可以根据需要动态编写这个txt文件并执行命令。

    更多信息请参考https://trac.ffmpeg.org/wiki/Slideshow

    【讨论】:

    • 但是如何将文件实时输入 ffmpeg 而不必先将所有文件都写入磁盘
    • 您可能会随身携带图片的网址。对于这种情况,请参阅stackoverflow.com/a/49349684/10860783
    • 但是如果所有的图片都已经制作好了,那么在制作图片时你如何输入它们呢?
    • 你能解释一下真实情况吗?如何在命令行上制作图像?您可能正在使用 js 或任何其他包装器。
    • 我有一个 c# 程序正在记录窗口的图像,例如屏幕录像机。没有固定的帧速率,所以它必须像屏幕录像机一样实时。现在我可以使用时间堆栈将它们全部保存到磁盘,然后根据每个时间戳生成具有持续时间的文本。但我不想先写磁盘,我想在 ffmpeg 中实时显示所有内容,因为它们被占用,每个都有不同的持续时间。我该怎么做
    【解决方案2】:

    似乎没有办法使用 ffmpeg 为不同的图像设置不同的持续时间。我会为每个图像创建单独的视频,然后使用 mencoder 将它们连接起来,如下所示:

    ffmpeg -f image2 -vframes 30 -i a.jpg -vcodec libx264 -r 1 a.mp4
    ffmpeg -f image2 -vframmes 10 -i bjpg -vcodec libx264 -r 1 b.mp4
    mencoder -ovc copy -o out.mp4 a.mp4 b.mp4
    

    用于 concat 操作的mencoder 需要所有输出视频具有相同的分辨率、帧率和编解码器。

    这里 a.mp4 有 30 帧,时长 30 秒,b.mp4 有 10 帧,时长 10 秒。

    【讨论】:

    • 我似乎无法将帧速率属性应用于其他输入。我可以设置第一个输入的帧速率(因此,持续时间),但所有其他的似乎默认为 25 的帧速率。此外,每个输入的开始时间为 0。我找到了 -itsoffset 参数,但我似乎也无法为连续输入设置它。你能详细说明一下吗?
    • 是的,你是对的。我现在有另一个解决方案。我将编辑上面的答案。
    • 抱歉耽搁了;我正在度假。但我仍然没有让这个工作。 -vframes 似乎与单个输出视频中的帧数无关——每个视频长一秒。此外,即使在 mplayer 中,最终输出的视频 (out.mp4) 也不会播放。它说缺少视频流,LAVF_header: av_find_stream_info() 失败。但可以肯定的是,必须有一种更有效的方法将单个帧编码为视频。是否有 Python 或 C 的功能(并且希望易于使用)库可以实现这一点?也许像 PIL 之类的东西,但对于视频?
    【解决方案3】:

    我能够使用以下命令解决完全相同的问题。 vframes 设置为秒数 * fps 在示例中,第一个视频有 100 帧(100 帧 / 25 fps = 4 秒),第二个视频有 200 帧(8 秒)

    ffmpeg -f image2 -loop 1 -vframes 100 -r 25 -i a.jpg -vcodec mpeg4 a.avi
    ffmpeg -f image2 -loop 1 -vframes 200 -r 25 -i b.jpg -vcodec mpeg4 b.avi
    mencoder -ovc copy -o out.mp4 a.mp4 b.mp4
    

    mencoder 部分就像 d33pika 的一样

    【讨论】:

    • 我们如何在不将 60000 多个视频写入磁盘的情况下做到这一点(如果视频有那么多帧)
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2012-05-19
    • 2018-10-07
    • 2010-12-24
    • 1970-01-01
    • 1970-01-01
    • 2014-11-11
    • 2019-04-12
    相关资源
    最近更新 更多