使用Windows Media Format(WMF)捕获桌面

时间:2008-09-15 14:47:54

标签: windows winapi wmf

我正在使用Windows Media Format SDK实时捕获桌面并将其保存在WMV文件中(实际上这是我项目的过度简化,但这是相关部分)。对于编码,我使用的是Windows Media Video 9 Screen编解码器,因为它对于屏幕捕获非常有效,并且几乎每个人都可以使用它而无需安装任何东西,因为编解码器包含在Windows Media Player 9运行时(包含在Windows XP SP1)。

我正在使用GDI函数制作BITMAP屏幕截图,并将这些BITMAP提供给编码器。你可以猜到,使用GDI进行屏幕截图很慢,而且我没有得到屏幕光标,我必须手动添加到BITMAP。我最初获得的BITMAP是DDB,我需要将它们转换为DIB以便编码器理解(RGB输入),这需要更多时间。

启动分析器显示大约50%的时间花费在编码器WMVCORE.DLL上。当然,这是预期的,因为编码是CPU密集型的。

问题是,有一个名为Windows Media Encoder的东西附带了一个SDK,可以使用所需的编解码器以更简单,更友好的方式进行屏幕捕获。

WME以WMF为基础。它是一个更高的杠杆库,也有.NET绑定。我不能在我的项目中使用它,因为这会带来我不得不避免的不必要的依赖。

我问的是WME用于将样本数据提供给WMV编码器的方法。编码与WME完全一样,就像我使用WMF的应用程序一样。 WME比我的应用程序更有效,因为它有更高效的方式将视频数据馈送到编码器。它不依赖于慢速GDI函数和DDB-> DIB转换。

怎么做?

3 个答案:

答案 0 :(得分:1)

CamStudio的源代码,这是一个GPL的截屏应用程序已经存在多年(商业化,然后是open-srcd)可能会有用吗?

http://sourceforge.net/project/showfiles.php?group_id=131922

我建议看看VNC客户端的内容,虽然它们可能非常简单(我想只是抓住屏幕截图然后jpg'自上次捕获以来已更改的磁贴)。

你可能想要考虑不使用WMV9作为即时编码的编码器,如果它太重了?也许使用HyperCam使用的旧的,效率较低的压缩器(如MS RLE),然后压缩到WMV? MS RLE一直是默认安装,因为至少Win2000我相信: http://wiki.multimedia.cx/index.php?title=Microsoft_RLE

CamStudio的无损编解码器是GPL(与上面相同的链接),它提供了非常好的压缩(虽然你需要在你的安装程序中捆绑dll)并且可以在运行中使用,它适用于所有的高压缩现代系统。

答案 1 :(得分:0)

自从我完成任何Win32编码以来已经很久了,但AFAIK,WMF作为一种格式基本上是GDI命令及其参数的列表,这可以解释为什么编码效率更高......

您可能需要挂钩到顶级GDI上下文(就像远程桌面那样,我猜)并在调用时捕获GDI命令。我似乎记得有一些创建WMF输出GDI上下文的方法,这意味着你可以以某种方式委托对它的调用。

我猜这里,但您可以在TightVNC / QuickVNC for Windows项目中找到上述示例代码,因为他们必须做类似的事情才能以有效的方式捕获屏幕上的更改。

答案 2 :(得分:0)

您是否已查看BB FlashBack库?

我正在进行类似的搜索,我刚刚开始评估BB FlashBack库。

我不确定外部依赖项或安装足迹。它似乎有一个必须安装的专有编解码器,但编解码器的安装可以由暴露的BB FlashBack API处理。

请注意,存在许可限制(许可证密钥的运行时设置,......)

如果您想在进行许可下载之前评估API,我可以通过电子邮件从SDK发送CHM。

我正在评估的事情: 正确捕获WPF视图 鼠标光标跟踪 存储电影的大小 如何在没有专有编解码器的情况下显示存储的电影(即SWF导出)

- Batgar