如何从一系列具有不同图像持续时间的图像创建视频?

问题描述:

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

我也将动态生成每个图像,所以如果有办法编码图像数据转换为视频帧,而无需将每张图像写入磁盘,这样做甚至更好。但是,这不是要求。

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

似乎没有办法使用ffmpeg为不同图像分配不同的持续时间。我会在使用mencoder这样创建的每个图像的单独的视频,然后CONCAT他们:

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 

的mencoder的CONCAT操作所需要的一切输出视频到具有相同的分辨率,帧率和编解码器。

这里a.mp4有30帧持续时间30秒,而b.mp4有10帧10秒。

+0

其中之一我似乎无法将帧速率属性应用于其他输入。我可以设置第一个输入的帧速率(因此也是持续时间),但是其他所有其他输入帧默认为25的帧速率。另外,每个输入的起始时间为0.我发现'-itsoffset'参数,但我似乎无法将其设置为连续输入。你能详细说明吗? – user1354557

+0

是的,你是对的。我现在有另一个解决方案。我将编辑上述答案。 – d33pika

+0

对不起,我正在度假。但我仍然没有得到这个工作。 '-vframes'似乎对各个输出视频中的帧数没有影响 - 每个视频长度都是1秒。而且,即使在mplayer中,最终输出视频(out.mp4)也不会播放。它说有一个丢失的视频流,并且'LAVF_header:av_find_stream_info()'失败。但肯定必须有一种更有效的方法来将单个帧编码成视频。是否有可用于Python或C的函数库(并且很容易使用)可以实现这个功能?也许像PIL,但对于视频? – user1354557

我能用以下命令解决完全相同的问题。 vframes被设定为秒数* FPS 在示例中,第一视频具有100帧(100帧/每秒25帧= 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