2

我正在使用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,可以使用所需的编解码器以更简单、更 CPU 友好的方式进行屏幕捕获。

WME 基于 WMF。它是一个更高级别的库,并且还具有 .NET 绑定。我不能在我的项目中使用它,因为这会带来我必须避免的不需要的依赖项。

我在询问 WME 用于将样本数据提供给 WMV 编码器的方法。编码发生在 WME 中,就像它发生在我使用 WMF 的应用程序中一样。WME 比我的应用程序更高效,因为它有一种更有效的方式将视频数据提供给编码器。它不依赖缓慢的 GDI 函数和 DDB->DIB 转换。

它是如何完成的?

4

3 回答 3

1

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

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

我建议也查看 VNC 客户端的内容,尽管它们可能非常简单(我认为只需抓取屏幕截图然后 jpg'ing 自上次捕获以来发生变化的图块)。

如果 WMV9 占用过多 CPU,您可能要考虑不使用 WMV9 作为即时编码的编码器?也许使用 HyperCam 使用的旧的、效率较低的压缩器(如 MS RLE),然后再压缩为 WMV?MS RLE 至少自 Win2000 以来一直是默认安装,我相信: http ://wiki.multimedia.cx/index.php?title=Microsoft_RLE

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

于 2008-10-21T11:31:26.413 回答
0

你检查过BB FlashBack库吗?

我也在寻找类似的东西,我刚刚开始评估 BB FlashBack 库。

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

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

如果您想在提交许可下载之前评估 API,我可以通过电子邮件将 SDK 中的 CHM 发送给您。

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

——巴特加

于 2008-12-29T18:29:36.410 回答
0

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

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

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

于 2008-09-18T01:42:08.637 回答