2016-01-13 106 views
6

我正在嘗試編寫一個應用程序,它將捕獲屏幕的視頻流並將其發送到遠程客戶端。我發現在Windows上捕獲屏幕的最佳方式是使用DXGI Desktop Duplication API(自Windows 8以來可用)。微軟提供了一個整齊的sample,可以將重複的幀傳輸到屏幕上。現在,我一直在想什麼是最簡單但仍然比較快速的方式來編碼這些幀並通過網絡發送它們。DXGI桌面複製:通過網絡發送幀的編碼

這些幀來自AcquireNextFrame,表面包含桌面位圖和元數據,其中包含已更新的髒區和移動區。從這裏,我有幾個選擇:

  1. 從一個DirectX表面提取的位圖,然後使用一個外部庫像的ffmpeg編碼系列的位圖到H.264和發送過來RTSP。雖然直截了當,但我擔心這種方法會太慢,因爲它沒有利用任何本地Windows方法。將D3D紋理轉換爲ffmpeg兼容位圖看起來像是不必要的工作。
  2. From this answer:將D3D紋理轉換爲IMFSample並使用MediaFoundation的SinkWriter對幀進行編碼。我發現了視頻編碼的this tutorial,但我還沒有找到立即獲取編碼幀併發送它的方式,而不是將它們全部轉儲到視頻文件。

由於之前我沒有做過這樣的事情,我在問我是否正朝着正確的方向前進。最後,我想要一個簡單的,最好是低延遲的桌面捕捉視頻流,我可以從遠程設備上查看。

此外,我想知道是否可以利用桌面複製提供的髒區和移動區域。我可以通過網絡發送它們並在客戶端進行處理,而不是通過編碼幀,我可以將它們發送到客戶端,但這意味着我的客戶端必須具有DirectX 11.1或更高版本,如果要將流式傳輸到移動平臺。

回答

4

您可以使用IMFTransform接口進行H264編碼。一旦你從ID3D11Texture2D獲得IMFSample,只需將其傳遞到IMFTransform :: ProcessInput並從獲得編碼的IMFSample IMFTransform :: ProcessOutput

請參閱this示例編碼細節。

一旦你得到了編碼的IMFSamples,你可以通過網絡逐一發送它們。

+0

Your link is dead –

+1

找到鏈接[here](https://github.com/ashumeow/webrtc4all/blob/master/gotham/MFT_WebRTC4All/test/test.cc) –