6

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

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

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

4

3 回答 3

5

我能够使用以下命令解决完全相同的问题。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 的一样

于 2013-06-23T23:19:11.670 回答
3

您可以使用 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

于 2020-10-06T06:22:11.030 回答
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 秒。

于 2012-12-21T07:07:17.627 回答