首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >OBS如何记录隐藏窗口?

OBS如何记录隐藏窗口?
EN

Stack Overflow用户
提问于 2021-11-12 01:25:05
回答 2查看 104关注 0票数 1

我正在编写一个程序,通过python和WIN32API库记录被另一个窗口遮挡的窗口。

经过多次搜索,我成功地通过hwnd和BitBlt捕捉到了隐藏窗口,但我的代码执行时间并不稳定。

我试图通过选择30~ 60fps来提供录制功能,但是捕获隐藏窗口并将其写入cv2的视频对象所需的时间是不规则的,所以我无法制作60fps的视频。

所以我想到了OBS和Discord。在OBS的情况下,可以对遮蔽的窗口实施稳定的记录。对于不一致,有一个功能可以让你选择一个特定的窗口,并实时与多个人分享(对于隐藏的窗口也可以这样做)。

我想知道这些程序如何为被遮挡的窗口提供稳定的视频。我是个学生,我不是精英。我之所以问这个问题,是因为很难分析OBS庞大的Github源代码。有没有人能给我解释一下上面的程序是如何捕捉屏幕的?

EN

回答 2

Stack Overflow用户

发布于 2021-11-12 01:43:08

@dy.kim,不要害怕大的代码库。window-capture.c和OBS GUI相当明显地将"bitblt“和"Windows Graphics Capture"列为用于捕获窗口的两种方法,如果两者都没有指定,则优先使用WGC。

票数 0
EN

Stack Overflow用户

发布于 2021-11-12 01:57:28

据我所知,OBS使用的是低级黑客而不是API。

具体地说,他们编写了一个DLL,并使用CreateRemoteThread WinAPI将其注入到目标应用程序中。然后,他们修补应用程序的代码以拦截对IDXGISwapChain.Present方法的调用。一旦调用被拦截,注入的代码就可以访问D3D帧缓冲区纹理。它可以将纹理复制到GPU上的另一个纹理中,然后对复制的纹理执行某些操作。一种可能性是DXGI表面共享,将副本从目标应用程序传递到捕获进程。The APIs for that不要求共享的两端都在同一进程中,纹理可以很好地跨进程共享。

不幸的是,他们的方法几乎不可能在像Python这样的高级语言中重新实现。这样的事情只在C++或类似的低级语言中是可行的,并且相对难以实现和调试。

票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/69936900

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档