我有一个使用GDI +和/或XNA渲染图形的.Net应用程序,我希望将帧直接记录到视频中(最好是AVI,我可以在其中包含像xvid等编解码器)。我已经尝试了许多解决方案,然后遇到所有这些解决方案。
所有基于FFMPeg的库似乎都致力于对现有流进行转码,而不是从帧中生成新流。
在codeplex上有一个名为Splicer的.Net库,但据我所知,它更适合构建“幻灯片”,因为它需要每个帧并将其存储在HD上。 directshow解决方案的行为方式相同。
然后有AVIFile包装器,这几乎就是我需要的。唯一的问题是,当你开始一个新的编码时,它弹出(有时是UNDER!?)一个对话框。该对话框对于正常使用来说不是问题,但我还需要将其作为服务运行,因此强制UI显然是一个显示停止。
任何人都知道另一个相对.Net友好的选项,或者我只是要求太多?
答案 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应指定宽度&高度