我正在编写一个程序,通过python和WIN32API库记录被另一个窗口遮挡的窗口。
经过多次搜索,我成功地通过hwnd和BitBlt捕捉到了隐藏窗口,但我的代码执行时间并不稳定。
我试图通过选择30~ 60fps来提供录制功能,但是捕获隐藏窗口并将其写入cv2的视频对象所需的时间是不规则的,所以我无法制作60fps的视频。
所以我想到了OBS和Discord。在OBS的情况下,可以对遮蔽的窗口实施稳定的记录。对于不一致,有一个功能可以让你选择一个特定的窗口,并实时与多个人分享(对于隐藏的窗口也可以这样做)。
我想知道这些程序如何为被遮挡的窗口提供稳定的视频。我是个学生,我不是精英。我之所以问这个问题,是因为很难分析OBS庞大的Github源代码。有没有人能给我解释一下上面的程序是如何捕捉屏幕的?
发布于 2021-11-12 01:43:08
@dy.kim,不要害怕大的代码库。window-capture.c和OBS GUI相当明显地将"bitblt“和"Windows Graphics Capture"列为用于捕获窗口的两种方法,如果两者都没有指定,则优先使用WGC。

发布于 2021-11-12 01:57:28
据我所知,OBS使用的是低级黑客而不是API。
具体地说,他们编写了一个DLL,并使用CreateRemoteThread WinAPI将其注入到目标应用程序中。然后,他们修补应用程序的代码以拦截对IDXGISwapChain.Present方法的调用。一旦调用被拦截,注入的代码就可以访问D3D帧缓冲区纹理。它可以将纹理复制到GPU上的另一个纹理中,然后对复制的纹理执行某些操作。一种可能性是DXGI表面共享,将副本从目标应用程序传递到捕获进程。The APIs for that不要求共享的两端都在同一进程中,纹理可以很好地跨进程共享。
不幸的是,他们的方法几乎不可能在像Python这样的高级语言中重新实现。这样的事情只在C++或类似的低级语言中是可行的,并且相对难以实现和调试。
https://stackoverflow.com/questions/69936900
复制相似问题