螢幕畫面擷取

畫面擷取是擷取螢幕上的圖像內容的程序。

背景

Display & Video 360 提供的用戶端具有初始 Screen Capture API,可立即轉譯並向用戶端呈現影格。用戶端沒有任何關於內容製作時間或下一個影格時間的資訊。不過,這項問題的解決方案仍提供效率不彰的問題,對於穩定狀態擷取的情況 (例如 Meet 等應用程式的情況) 並非最佳選擇。

而在新版 Screen Capture API 中,View 可吸收原始 API 提供的用戶端複雜性,並讓客戶使用起來更加輕鬆。

設計

螢幕擷取功能的目標是卸載排程工作,何時該傳回下一個影格至畫面,而非用戶端。方法是使用 Frame Scheduler (目前已知 VSYNC 和閂鎖點)。在用戶端要求下一個影格後,您不會立即轉譯及傳回影格,而從用戶端呼叫 GetNextFrame() 將是 hanging-get 要求。影格排程器和 Flatland 將會執行工作,並在轉譯下一個影格後與 API 聯絡。然後「螢幕畫面擷取」功能便會將算繪元件提供給呼叫 GetNextFrame() 的用戶端。

螢幕擷取管理員會保存每個用戶端的狀態。用戶端要求下一個影格時,如果收到最後一個產生的影格,管理員就會等到從 Frame Scheduler 接收信號之後,才會傳回影格。

如果用戶端尚未收到產生的最後一個影格,螢幕擷取功能會立即傳回最新的影格。這個過程會在用戶端第一次呼叫 Screen Capture 時發生,因為客戶尚未收到上一個影格,以及用戶端錯過影格之後的任何呼叫。用戶端現在會接收最近產生的影格。

螢幕畫面擷取流程

API 設計

設定()

設定 Screen Capture API 的主要通訊協定。用戶端應先使用 Flatland 分配器註冊要使用的 BufferCollection。接著應呼叫 Set(),因為這麼做會調整要在擷取畫面時使用的設定、緩衝區和圖片。

GetNextFrame()

GetNextFrame() 會盡快將最新未出現的頁框傳回用戶端。如果用戶端尚未收到最後顯示的影格,系統會立即傳回此影格。如果已設定,這個畫面就會是下一個要算繪的影格。

捨棄緩衝區

用戶端完成緩衝區後,應捨棄 GetNextFrame() 回呼中包含的事件組合。