2016-01-13 16 views
6

私は画面のビデオストリームをキャプチャしてリモートクライアントに送信するアプリケーションを作成しようとしています。 Windows上で画面をキャプチャする最も良い方法は、DXGI Desktop Duplication API(Windows 8以降で使用可能)を使用することです。マイクロソフトでは、重複したフレームを画面にストリームする、きちんとしたsampleを提供しています。さて、私は、これらのフレームをエンコードしてネットワーク経由で送信する最も簡単ではあるが、まだ比較的高速な方法を考えてきました。DXGI Desktop Duplication:ネットワークを介して送信するフレームを符号化する

フレームはAcquireNextFrameから、デスクトップビットマップと、更新されたダーティー領域とムーブ領域を含むメタデータが含まれています。

  1. は、DirectXの表面からビットマップを抽出して、H.264に一連のビットマップをエンコードし、RTSPの上にそれを送信するためにffmpegののような外部ライブラリを使用します。ここから、私はオプションのカップルを持っています。簡単ですが、ネイティブのWindowsメソッドを利用していないため、この方法が遅すぎることが懸念されます。 D3Dテクスチャをffmpeg互換のビットマップに変換することは、不要な作業のようです。
  2. From this answer:D3DテクスチャをIMFSampleに変換し、MediaFoundationのSinkWriterを使用してフレームをエンコードします。ビデオエンコーディングのthis tutorialが見つかりましたが、エンコードされたフレームをすぐに取得し、ビデオファイルにすべてをダンプする代わりに送信する方法はまだ見つかりませんでした。

私はこれまでにこのようなことをしていないので、私が正しい方向に動いているかどうか尋ねています。結局のところ、リモートデバイスから見ることができる、シンプルで、好ましくはレイテンシの低いデスクトップキャプチャビデオストリームが必要です。

また、私はDesktop Duplicationによって提供される汚れた領域と移動領域を利用できるかどうかは疑問です。フレームをエンコードするのではなく、ネットワーク経由で送信してクライアント側で処理することもできますが、これはクライアントがDirectX 11.1以降を使用できることを意味します。モバイルプラットフォームにストリームしたい場合は不可能です。

答えて

4

IMFTransform H264エンコーディングのインターフェイスを使用できます。 ID3D11Texture2DからIMFSampleを取得したら、IMFTransform :: ProcessInputに渡し、符号化されたIMFSampleをIMFTransform :: ProcessOutputから取得します。

エンコードの詳細については、thisの例を参照してください。

コード化されたIMFSサンプルを取得したら、ネットワーク経由でそれらを1つずつ送信できます。

+0

リンクがありません –

+1

リンクを見つけました[https://github.com/ashumeow/webrtc4all/blob/master/gotham/MFT_WebRTC4All/test/test.cc] –

関連する問題