gpt4 book ai didi

windows - 使用 Windows 媒体格式 (WMF) 捕获桌面

转载 作者:可可西里 更新时间:2023-11-01 10:41:01 28 4
gpt4 key购买 nike

我正在使用 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 绑定(bind)。我不能在我的项目中使用它,因为这会带来我必须避免的不需要的依赖项。

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

它是怎么做到的?

最佳答案

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

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

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

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

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

关于windows - 使用 Windows 媒体格式 (WMF) 捕获桌面,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/63563/

28 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com