次の方法で共有


ストリーム間でのデータの共有

[このページに関連付けられている機能 DirectShow は、従来の機能です。 MediaPlayer、IMFMediaEngine、Media Foundation のオーディオ/ビデオ キャプチャに置き換わりました。 これらの機能は、Windows 10とWindows 11用に最適化されています。 新しいコードでは、可能であれば、DirectShow ではなく Media Foundation で MediaPlayerIMFMediaEngineAudio/Video Capture を使用することを強くお勧めします。 Microsoft は、レガシ API を使用する既存のコードを、可能であれば新しい API を使用するように書き換えるよう提案しています。]

注意

これらの API は非推奨です。 アプリケーションでは 、サンプル グラバー フィルターを使用するか、カスタム フィルターを実装して DirectShow フィルター グラフからデータを取得する必要があります。

 

マルチメディア データの処理には、通常、多くのシステム リソースが必要です。そのため、可能な限りデータのコピーは避ける必要があります。 ストリーミング アーキテクチャでは、共有ストリーム サンプルがサポートされています。これは、データをコピーせずにあるストリームから別のストリームに移動するメカニズムです。 このバッファーを使用すると、宛先ストリームが基になるデータ形式を特にサポートしていない場合でも、2 つのストリーム間で効率的にデータを転送できます。

たとえば、ビデオとオーディオの 3 つのデータ ストリームを含むマルチメディア ストリームがあり、ビデオ コンテンツに合わせて URL データのタイムスタンプが設定されているとします。 すべてのビデオ フレームに著作権通知を追加し、データをストレージ用の別のストリームに書き込むアプリケーションを作成する必要がありますが、アプリケーションはビデオ ストリーム以外のデータ形式を理解していません。 ビデオ ストリームの場合は、目的の DirectDraw サーフェスにアタッチされたサンプルを作成します。 その後、同じサーフェスへのポインターを使用して IDirectDrawMediaStream::CreateSample メソッドを呼び出すか、 IMediaStream::CreateSharedSample を呼び出して、出力ストリームを作成できます。 どちらの場合も、入力ストリームと出力ストリームは DirectDraw サーフェスを共有します。 ビデオ形式を理解しているため、必要に応じてこの画面にアクセスできます。

他のソース ストリーム ポインター (オーディオと URL) を取得するには、ソース コンテナー ストリームを列挙し、ビデオ以外のストリームへのポインターを取得します。 これらの各ソース ストリームには、出力ストリーム コンテナーに関連付けられた出力ストリームがあります。 これらの出力ポインターを取得するには、各ソース ストリーム ポインターを使用して、出力コンテナーで IMultiMediaStream::GetMediaStream メソッドを呼び出します。 次に、このプロセスの手順を説明します。

  1. IMultiMediaStream::EnumMediaStreams を呼び出して、ソース ストリームへのポインターを取得します。 アプリケーションが既にその形式を理解しているため、ビデオ ストリームではないことを確認します。
  2. 手順 1 のポインターを使用して、出力コンテナー ストリームで IMultiMediaStream::GetMediaStream を呼び出します。 これにより、目的の出力ストリームへのポインターが返されます。
  3. ソース ストリームで AllocateSample を呼び出します。
  4. 出力ストリームで CreateSharedSample を呼び出します。
  5. ソース ストリームで Update を呼び出してデータを読み取ります。
  6. 出力ストリームで Update を呼び出して、データを書き込みます。

サポートされていない形式のストリームごとに、これらの手順を繰り返します。 両方のサンプルの更新が完了すると、出力ストリームにはソース ストリームのすべてのデータが含まれており、完了です。