使用Delphi或FFMpeg从图像序列创建电影

3

我的Delphi应用程序已经创建了一个名为frame_001.png到frame_100.png的序列。

我需要将其编译成电影剪辑。根据ffmpeg的文档,我认为最简单的方法可能是从命令行调用ffmpeg:

要从多个图像创建视频:

ffmpeg -f image2 -i foo-%03d.jpeg -r 12 -s WxH foo.avi

语法foo-%03d.jpeg指定使用由三个数字组成的十进制数来表示序列号,并用零填充。它是C printf函数支持的相同语法,但只有适合普通整数的格式。

来自:http://ffmpeg.org/ffmpeg-doc.html#SEC5

然而,我的文件是(无损)png格式,因此我必须先使用imagemagick进行转换。

现在我的命令行是:

ffmpeg.exe -f image2 -i c:\temp\wentelreader\frame_%05d.jpg -r 12 foo.avi

但是我得到了错误:

[image2 @ 0x133a7d0]无法找到编解码器参数(视频:mjpeg) c:\temp\wentelreader\Frame_C:\VID2EVA\Tools\Mencoder\wentel.bat5d.jpg: 找不到编解码器参数

我做错了什么?

或者,这可以很容易地用Delphi完成吗?

4个回答

3

2

FFmpeg可以从PNG图像创建电影,为什么您认为需要将它们转换为JPEG?


1
我之前遇到了一个错误,让我以为在(稀疏的!)手册中没有提到png。谢谢,好知道。现在如果我能弄清楚命令行就好了 :) - Hein du Plessis
png或jpeg不是问题 - 我无法使命令行起作用,因为它将%0d参数替换为我正在调用它的批处理文件的名称。 - Hein du Plessis
@rob 给了你答案,使用 %%05f 而不是 %05d - Shay Erlichmen

2
看一下错误信息中的文件名。那肯定不对。百分号需要完全传递到你运行的程序,但它被批处理文件所展开了,其中%0会扩展为文件的完整名称和路径。在批处理文件中将百分号加倍:

ffmpeg.exe -f image2 -i c:\temp\wentelreader\frame_%%05d.jpg -r 12 foo.avi

此外,既然你已经说你的文件像frame_001.png这样命名,只有三个数字,为什么你要使用五个数字呢?

谢谢Rob!现在回想起来很明显了...我现在遇到了以下错误,即使我从批处理文件中退出也是一样的:c:\temp\wentelreader\Frame_%05d.jpg: I/O 出错 通常这意味着输入文件被截断和/或已损坏。frame_001.png只是一个示例,后来我决定引用我的代码。真实的文件名是Frame_00000.jpg - Frame_03961.jpg。 - Hein du Plessis
好的,更新了 - 使用原始的 PNG 看起来现在可以工作了。我觉得之前 JPEG 的路径有误。再次感谢! - Hein du Plessis

2
DelphiFFMpeg的家伙们已经为FFMpeg制作了一个组件包装器。它非常昂贵,但测试它是值得的。然而,你想要做的事情非常简单,使用命令行就足够了。

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接