我正在制作一個程式來記錄一個通過 python 和 WIN32API 庫被另一個視窗遮擋的視窗。
通過多次搜索,我通過hwnd和BitBlt成功捕獲了隱藏視窗,但是我的代碼執行時間并不穩定。
我試圖通過選擇30~60 fps來提供錄制功能,但是捕獲隱藏視窗并將其寫入()到cv2的視頻物件所需的時間是不規則的,所以我無法制作60fps的視頻。
所以我想到了 OBS 和 Discord。在 OBS 的情況下,可以對被遮擋的視窗強制執行穩定記錄。對于 Discord,有一項功能可以讓您選擇特定視窗并實時與多人共享(也可以對隱藏視窗執行此操作)。
我想知道這些程式如何為被遮擋的視窗提供穩定的視頻。我是學生,我不是精英。我問這個問題是因為很難分析OBS龐大的Github源代碼。有人可以解釋一下上述程式如何捕獲螢屏嗎?
uj5u.com熱心網友回復:
@dy.kim,不要害怕大型代碼庫。 
uj5u.com熱心網友回復:
上次我檢查時,OBS 使用的是低級黑客而不是 API。
具體來說,他們撰寫了一個 DLL,他們使用CreateRemoteThread WinAPI將其注入到目標應用程式中。然后,他們修補應用程式的代碼以攔截對IDXGISwapChain.Present方法的呼叫。一旦呼叫被攔截,注入的代碼就可以訪問 D3D 幀緩沖區紋理。它可以將該紋理復制到 GPU 上的另一個紋理中,然后對副本執行某些操作。一種可能性是 DXGI 表面共享,以將副本從目標應用程式傳遞到捕獲程序。用于此的 API不需要共享的雙方在同一行程中,紋理可以跨行程共享就好了。
對您來說不幸的是,他們的方法幾乎不可能在 Python 等高級語言中重新實作。這樣的事情只有在C 或類似的低級語言中才能做到,而且相對難以實作和除錯。
轉載請註明出處,本文鏈接:https://www.uj5u.com/net/364318.html
上一篇:參考文本檔案并移動不在該檔案中的所有內容的Powershell腳本
下一篇:如何替換包含空格的目錄的位置
