如何从硬件覆盖(而不是从我的应用程序)抓取视频帧?

时间:2011-11-17 09:26:12

标签: video overlay directshow frame-grab

我一直在寻找一种从当前硬件叠加层中的视频中获取帧的方法,而且我找不到任何可靠的内容。我发现的一切都是从你正在播放的视频中抓取帧(在你的应用程序中)或创建一个过滤器,我无法找到一个很好的例子,我将如何在我的应用程序中抓取帧(或者应用程序可以一个内存过滤器,不需要“安装”并在播放器中选择?)。

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

我已经看到为DirectX完成了所有DirectX信息的挂钩,但是,硬件覆盖不是DirectX,是吗?或者我可以挂钩到DirectX并从那里抓取前端缓冲区吗?

我一直在寻找有关这个问题的资源,但是我一直在圈子里,并且有人想要将叠加层放在DirectX表面上的事实无济于事,很多结果都是关于这个话题的

如果它是相关的,我更喜欢C ++中的解决方案(我的应用程序是C ++,目前使用“常规”方式从屏幕截取屏幕截图,其中黑色矩形用于硬件覆盖)。

2 个答案:

答案 0 :(得分:0)

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

答案 1 :(得分:0)

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

这样你就可以锁定叠加层,这通常是一种有限的资源,例如:每个视频适配器一个,感兴趣的应用程序将无法使用它。