繁体   English   中英

从.Net逐帧创建视频

[英]Create Video, Frame by frame, from .Net

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

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

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

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

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

实际上,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();

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

如果你仍然想使用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文档

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

它应该是对您的本机AVIFile的一个相当简单的更改,您的包装应该仍然有效。

看看这个示例 ,了解如何初始化AVICOMPRESSOPTIONS。

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

“XNA中没有任何东西可以帮助你 - 你需要查看其他Windows API。你可以使用XNA来捕获后台缓冲区,然后保存每一帧,但有很多事情需要关注。从后面拉出每一帧缓冲区立即产生一些延迟,压缩图像(如果您选择动态压缩)是CPU重,保存到文件会增加延迟。

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

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM