2009-05-28 23 views
1

创建视频逐帧,我有一个.Net应用程序呈现图形使用GDI +和/或XNA,我想直接将帧记录到视频(最好是AVI,我可以包括一个编解码器像xvid等)。我已经尝试了很多解决方案,并与所有这些解决方案合作。从.Net

所有基于FFMPeg的库似乎专门用于对现有流进行代码转换,而不是从帧生成新的流。

在codeplex上有一个名为Splicer的。lib库,但是我可以告诉它它更适合构建“幻灯片放映”,因为它需要每个帧并将其存储在HD上。 directshow解决方案的行为方式相同。

然后是AVIFile包装,这几乎是我所需要的。唯一的问题是,当你开始一个新的编码时,它会弹出一个对话框(有时候是UNDER !?)。对话框不是正常使用的问题,但我也需要将它作为服务来运行,所以强制用户界面显然是一个显示屏。

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

回答

1

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

它应该是一个相当简单的改变你的本地AVIFile和你的包装应该仍然工作。

看看这个sample如何初始化AVICOMPRESSOPTIONS。

1

在XNA论坛上查看this question以获取一些洞察和考虑事项,如果您想在XNA中执行此操作。特别是,该答复的ZMAN:

“没有什么在XNA来帮助你 在这里 - 你需要寻找其他 的Windows API你可以使用XNA来 捕获后缓冲区,然后保存。 每一帧了,但还有很多事情 予以关注。从后缓冲器瞬间 拉各 框架带来了一些延迟,压缩 图像(如果你选择压缩上 飞)是CPU重,保存到 文件增加了延迟。

DirectShow是一种可以用来对 进行压缩的API--其他的还有很多 。关/ MP4等。SOund录音 有DSound,我认为DShow可以使用 DSound来抓取音频输出。 他们是相当专业的API,所以你 可能想寻求其他论坛。”

+0

我已经从XNA(framebuffer)工作捕获,我只需要一些东西来编码视频。我想我最终会坚持使用AVIFile,但要做出上面Ben Schwehn建议的更改。 – Brook 2009-06-11 19:51:44

1

其实,捻接器可以产生平滑的视频从多个静态帧,你只需要确保您设置的apropriate剪辑偏移和剪辑当你调用ITrack.AddFrame时结束参数。在我的程序我使用:

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

其中videoTrack来自:

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

在我的视频导出的构造函数的模拟程序我工作。

+0

感谢您的参考......由于不明原因,我没有成功让AVIFile工作;而拼接器(又是DirectShow)看起来就像他们会做的那样。 – harpo 2011-01-21 21:16:10

1

如果你仍然想使用的ffmpeg,然后写入帧到磁盘和使用类似

的ffmpeg -f图像2 -i foo-%03d.jpeg -r -s 12宽x高foo.avi

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

-r 12指定每秒

12帧-s宽x高应指定宽度&高度

这是从ffmpeg documentation