0

我一直在寻找一种方法来从当前在硬件覆盖中的视频中抓取一帧,但我还没有找到任何可靠的东西。我发现的一切要么是从您正在播放的视频中抓取帧(在您的应用程序中),要么是创建一个过滤器,我找不到一个很好的例子来说明如何在我的应用程序中实际抓取帧(或者应用程序可以是不需要在播放器中“安装”和选择的内存过滤器?)。

所以,我的问题是我该怎么做呢?我知道使用过滤器是可能的,我已经看到它完成了,我只是还没有看到它是如何完成的。是否有一个很好的例子来说明如何在过滤器中抓取帧并将它们发送到我的应用程序?或者有没有办法像挂钩到一些过程调用并以某种方式从那里获取框架?

我已经看到为 DirectX 完成挂钩以获取所有 DirectX 信息,但是,硬件覆盖不是 DirectX,是吗?或者我可以直接连接到 DirectX 并从那里获取前端缓冲区或其他什么?

我一直在寻找有关此问题的资源,但我一直在兜圈子,而且有人想将叠加层放在 DirectX 表面上这一事实无济于事,很多结果都与该主题有关。

如果相关,我更喜欢 C++ 中的解决方案(我拥有的应用程序是 C++ 中的,目前使用从屏幕抓取屏幕截图的“常规”方式,这当然会为硬件覆盖留下黑色矩形)。

4

2 回答 2

0

我知道如何使用 directshow 抓取帧有两种方法。第一个是使用 SampleGrabber 过滤器,互联网上有很多示例。第二个是使用您的自定义视频渲染器,在这种情况下,您必须实现自己的过滤器,您可以使用来自平台 sdk 的 baceclasses 项目,以便从 cbasevideorenderer 派生并实现您的渲染方法。

于 2011-11-17T09:36:41.357 回答
0

如果您首先需要应用程序的图像并且硬件覆盖是获取快照的障碍,也许最简单的方法是制作一个通过覆盖开始视频播放的简单应用程序(您不需要流式传输真实样本!只需暂停图表就足够了)并在运行您感兴趣的应用程序之前运行您的应用程序。

这样,您将锁定覆盖,这通常是一种有限的资源,例如每个视频适配器一个,并且感兴趣的应用程序将无法使用它。

于 2011-11-17T10:56:49.587 回答