从.Net逐帧创建视频

时间:2009-05-28 12:14:32

标签: c# .net video

我有一个使用GDI +和/或XNA渲染图形的.Net应用程序,我希望将帧直接记录到视频中(最好是AVI,我可以在其中包含像xvid等编解码器)。我已经尝试了许多解决方案,然后遇到所有这些解决方案。

所有基于FFMPeg的库似乎都致力于对现有流进行转码,而不是从帧中生成新流。

在codeplex上有一个名为Splicer的.Net库,但据我所知,它更适合构建“幻灯片”,因为它需要每个帧并将其存储在HD上。 directshow解决方案的行为方式相同。

然后有AVIFile包装器,这几乎就是我需要的。唯一的问题是,当你开始一个新的编码时,它弹出(有时是UNDER!?)一个对话框。该对话框对于正常使用来说不是问题,但我还需要将其作为服务运行,因此强制UI显然是一个显示停止。

任何人都知道另一个相对.Net友好的选项,或者我只是要求太多?

4 个答案:

答案 0 :(得分:1)

我不知道您正在使用哪个AVIFile包装器,但我相信AviFile可能正在调用AVISaveOptions来获取初始化的AVICOMPRESSOPTIONS结构。您可以自己初始化AVICOMPRESSOPTIONS。 AVICOMPRESSOPTIONS中的大多数成员都很容易。 lpParms和cbParms包含二进制编解码器配置数据的块(cbParms =块长度)。您可以通过ICGetState获取此数据。

对你的原生AVIFile应该是一个相当简单的改变,你的包装应该仍然有效。

关于如何初始化AVICOMPRESSOPTIONS,请查看此sample

答案 1 :(得分:1)

如果您想在XNA中执行此操作,请查看XNA论坛上的this question以获取一些见解和注意事项。尤其是ZMan的答案:

  

“XNA中没有任何东西可以帮助你   在这里 - 你需要看看其他人   Windows API。你会使用XNA   捕获后台缓冲区然后保存   每一帧都有,但有很多东西   要关注。拉每个   立即从后缓冲区框架   创建一些延迟,压缩   图像(如果您选择压缩   苍蝇)是CPU重,节省到一个   文件增加了延迟。

     

DirectShow是您可以使用的一种API   做压缩 - 有很多   其他。关/ MP4等SOund录音   有DSound,我认为DShow可以使用   DSound也可以获取音频输出。   它们是相当专业的API,所以你   可能想找出其他论坛。“

答案 2 :(得分:1)

实际上,Splicer可以从多个静止帧生成平滑视频,您只需要确保在调用ITrack.AddFrame时设置适当的剪辑偏移和剪辑结束参数。在我的程序中,我使用:

videoTrack.AddImage(buffer, 0, 1f / FramesPerSecond);

videoTrack来自:

timeline = new DefaultTimeline(framesPerSecond);
videoGroup = timeline.AddVideoGroup("main", framesPerSecond, 24, width, height);
videoTrack = videoGroup.AddTrack();

在我正在处理的模拟程序的视频导出器的构造函数中。

答案 3 :(得分:1)

如果您仍想使用ffmpeg,请将帧写入磁盘并使用类似

的内容

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

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

-r 12指定每秒12帧

-s WxH应指定宽度&高度

这来自ffmpeg documentation