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



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

所以,我的问题是我该怎么做呢?我知道用滤镜是可能的,我见过这样做,我只是没见过怎么做。是否有一个很好的例子,如何在过滤器中抓取帧并将其发送到我的应用程序?或者有没有一种方法,比如,钩子到某个过程调用然后从那里获取帧?

我已经看到钩子为DirectX做得到所有的DirectX信息,但是,硬件覆盖不是DirectX,是吗?或者我可以直接钩到DirectX然后从那里获取前缓冲区之类的?

我一直在寻找关于这个问题的资源,但我一直在兜圈子,事实上,有些人想把覆盖在DirectX表面上没有帮助,很多结果都是关于这个话题的。

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

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

如果你首先需要应用程序的图像,而硬件覆盖是获得快照的障碍,也许最简单的方法是制作一个简单的应用程序,通过覆盖开始视频播放(你不需要流真实的样本!在运行您感兴趣的应用程序之前先运行您的应用程序。

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

最新更新