使用Windows Media Format(WMF)捕获桌面
我正在使用Windows Media Format SDK实时捕获桌面并将其保存在WMV文件中(实际上这是我的项目的过度简化,但这是相关的部分)。对于编码,我使用的是Windows Media Video 9屏幕编解码器,因为它对屏幕捕获非常有效,并且因为该编解码器包含在Windows Media Player 9运行时中(包括Windows XP SP1)。
我正在使用GDI功能制作BITMAP屏幕截图,并将这些BITMAP馈送到编码器。如我们所料,使用GDI拍摄屏幕截图的速度很慢,并且没有屏幕光标,我必须手动将其添加到BITMAP中。我最初获得的BITMAP是DDB,我需要将其转换为DIB,以使编码器能够理解(RGB输入),这需要更多时间。
触发分析器表明,大约50%的时间花费在了编码器WMVCORE.DLL中。当然,这是可以预期的,因为编码是CPU密集型的。
关键是,SDK附带了一个称为Windows Media Encoder的东西,它可以以所需的编解码器以更简单,更友好的CPU方式进行屏幕捕获。
WME基于WMF。它是一个更高级别的杠杆库,还具有.NET绑定。我不能在我的项目中使用它,因为这带来了我必须避免的不必要的依赖关系。
我在问WME用于将样本数据馈送到WMV编码器的方法。使用WME进行编码与使用WMF的应用程序进行编码完全相同。 WME比我的应用程序更有效,因为它具有将视频数据馈送到编码器的更有效的方法。它不依赖缓慢的GDI功能和DDB-> DIB转换。
怎么做?
解决方案
回答
自从我完成任何Win32编码以来,已经很久了,但是AFAIK,WMF作为一种格式基本上是GDI命令及其参数的列表,这可以解释为什么编码效率更高...
我们可能需要挂接到顶层GDI上下文(我想就像远程桌面一样)并捕获被调用的GDI命令。我似乎记得有一种创建WMF输出GDI上下文的方法,这意味着我们可以通过某种方式将调用委派给它。
我在这里猜测,但是我们可能能够在Windows项目的TightVNC / QuickVNC中找到上述示例代码,因为它们必须执行类似的操作才能有效捕获屏幕上的更改。
回答
CamStudio的源代码可能有用吗?CamStudio是GPL的屏幕广播应用程序,已经存在多年了(商业上,然后在以后打开srcd)。
http://sourceforge.net/project/showfiles.php?group_id=131922
我建议也考虑一下VNC客户端的胆量,尽管它们可能非常简单(我认为只是抓取屏幕截图,然后将自上次捕获以来已更改的图块jpg')。
如果过于繁琐,我们可能要考虑不使用WMV9作为即时编码的编码器?也许使用HyperCam使用的较旧,效率较低的压缩器(例如MS RLE),然后再压缩为WMV?至少从Win2000开始,MS RLE已成为默认安装,我相信:
http://wiki.multimedia.cx/index.php?title=Microsoft_RLE
CamStudio的无损编解码器是GPL(与上面的链接相同),它提供了很好的压缩(尽管我们需要将dll捆绑在安装程序中)并且可以即时使用,它在所有现代系统上的高压缩率下都能很好地工作。
回答
我们是否签出了BB FlashBack库?
我正在进行类似的狩猎,并且我刚刚开始评估BB FlashBack库。
我不确定外部依赖项或者安装占用空间。它似乎具有必须安装的专有编解码器,但是编解码器的安装可以由公开的BB FlashBack API处理。
当心,存在许可限制(许可证密钥的运行时设置,...)
如果我们想在提交授权下载之前评估API,我可以通过电子邮件从SDK向我们发送CHM。
我正在评估中的事情:
正确捕获WPF视图
鼠标光标跟踪
储存影片的大小
如何在没有专有编解码器的情况下显示存储的电影(即SWF导出)
-巴尔加