我正在使用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 转换。
它是如何完成的?