Microsoft DirectX 8.0 |
ここでは、マルチメディア ストリーミングのアーキテクチャと、ソフトウェア開発者がツールまたはアプリケーションでストリームを使用するときの標準的な使い方について説明する。また、データ転送の基盤としてのストリーミングの利点、およびマルチメディア プログラミングの要点 (ストリーミング アプリケーションでのデータ転送、パフォーマンスの最適化、タイム スタンプ処理など) についても説明する。マルチメディア ストリーミングを使用するプログラマは、COM プログラミングの概念を十分理解している必要がある。
以下の項で構成される。
マルチメディア ストリーミングを使用すると、フォーマット固有のプログラム量を大幅に削減できる。通常、アプリケーションからファイルやハードウェアのメディア データを取得するには、データ フォーマットおよびハードウェア デバイスについてわからないことがあってはならない。接続、データ転送、必要なデータ変換、および実際のデータ レンダリングやファイル格納を、すべて処理する必要があるからである。フォーマットおよびデバイスはそれそれ微妙に異なるため、この処理は複雑で煩雑なものになることが多い。対照的に、マルチメディア ストリーミングを使用すると、ソースからアプリケーションに渡されるデータの転送と変換が自動的にネゴシエートされる。ストリーミング インターフェイスは、データのアクセスと制御のための均一でわかりやすいメソッドを提供する。アプリケーションでは、これらのメソッドを使用することによって、ソースやフォーマットにかかわりなく、データを簡単に再生することができる。
以下のステップは、ハードウェア デバイスからレンダリング再生へのストリーミングの実装方法を示す。
マルチメディア ストリームの仕様は、複数のインターフェイスから構成され、各インターフェイスは、ストリーム処理の特定の性質を制御するメソッドや、特定の種類のデータを処理するメソッドから構成される。詳細については、「マルチメディア ストリーミング インターフェイスの一覧」を参照すること。
次の図は、マルチメディア ストリーミングに使用する基本的なオブジェクトの階層構造を示す。
マルチメディア ストリーミング アーキテクチャには、以下の 3 種類の基本オブジェクトが定義されている。
IMultiMediaStream インターフェイスをサポートするオブジェクトは、マルチメディア データ ストリームのための基本的なコンテナである。IMultiMediaStream インターフェイスには、オブジェクトのデータ ストリームを列挙するメソッドが含まれる。これらのストリームには、通常、ビデオ データおよびオーディオ データが含まれるが、クローズド キャプション、プレーン テキスト、SMPTE タイムコードなどの任意のフォーマットのデータを含めることができる。IMultiMediaStream インターフェイスは汎用コンテナだが、開発者はこのインターフェイスから特定のデータ フォーマットをサポートする別バージョンのインターフェイスを作成できる。たとえば、IAMMultiMediaStream インターフェイスを実装するオブジェクトは、DirectShow の任意のデータ フォーマットを持つストリームを列挙および制御できる。個々のデータ ストリームはフォーマット固有なので、これらのオブジェクトは、異なったインターフェイスを少なくとも 2 つ (汎用インターフェイスとデータ固有のインターフェイス) サポートする。すべてのストリームは、そのフォーマットとストリーム自体へのポインタを取得するメソッドを提供する IMediaStream インターフェイスをサポートする。一方、IDirectDrawMediaStream インターフェイスには、ビデオ データのレンダリングを専門に処理するメソッドが含まれる。IMultiMediaStream から派生するすべてのインターフェイスは、ストリーム サンプル (データ ストリーミングの基本単位) の作成もサポートする。
マルチメディア サンプルは、メディア データが格納されたオブジェクトへの参照である。ビデオ イメージでは、これが DirectDraw サーフェスとなる。サンプルの正確な内容は、メディアの種類 (サウンドやテキストなど) によって異なる。サンプルはデータ オブジェクトへの単なる参照なので、任意の数のストリーム サンプルから 1 つのサンプル オブジェクトを参照することができる。IStreamSample インターフェイスは、サンプルの特性 (開始タイム、終了タイム、状態、およびストリームとの関連) を取得および設定するメソッドを提供する。IStreamSample::Update メソッドは、ストリームが読み取り可能であれば、サンプルのデータに最新状態を反映する。また、ストリームが書き込み可能であれば、サンプルのデータをストリームに書き込む。通常、Update メソッドは、ストリーミング データをレンダリング、転送、または格納するループで使用する。
マルチメディア ストリーミング インターフェイスは、ハードウェア ソースまたはソフトウェア ソースの特定の特性への依存性を排除し、Microsoft DirectX® の全メディア フォーマットのサポートを提供することにより、マルチメディア データの処理を大幅に単純化する。ストリームによってデータが非常に高いレベルまで抽象化されるため、アプリケーションでは、フォーマットをまったく意識せずに、データを別のストリームに移動できる。
マルチメディア ストリームを作成するには、以下のステップを実行する。
マルチメディア ストリーミング インターフェイスの詳細については、「マルチメディア ストリーミング」を参照すること。
マルチメディア データの処理には、通常、大量のシステム リソースが必要になる。したがって、データのコピーはできる限り避けなければならない。ストリーミング アーキテクチャは、データをコピーぜすに別のストリームに移動するためのメカニズムである、共有ストリーム サンプルをサポートする。このバッファを使用すると、基盤となるデータ フォーマットが転送先ストリームで明確にサポートされていなくても、2 つのストリーム間で効率よくデータを転送できる。
たとえば、3 つのデータ ストリーム (ビデオ、オーディオ、およびビデオ コンテンツに対応するタイム スタンプが入った URL データ) を持つマルチメディア ストリームがあり、ビデオ フレームすべてに著作権表記を追加し、保存のためにデータを別のストリームに書き込むアプリケーションを作成したいが、アプリケーションがビデオ ストリーム以外のデータ フォーマットを理解できないものと想定する。ビデオ ストリームについて、希望の DirectDraw サーフェスにアタッチされたサンプルを作成する。次に、同じサーフェスへのポインタを指定して IDirectDrawMediaStream::CreateSample メソッドを呼び出すか、または IMediaStream::CreateSharedSample を呼び出して、出力ストリームを作成する。どちらの場合も、入力ストリームと出力ストリームは DirectDraw サーフェスを共有する。ビデオ フォーマットは理解できるので、このサーフェスには必要に応じてアクセスすることができる。
その他のソース ストリーム ポインタ (オーディオおよび URL) を取得するには、ソース コンテナ ストリームを列挙して、ビデオ以外のストリームへのポインタを把握する。これらの各ソース ストリームには、出力ストリーム コンテナ内の出力ストリームが関連付けられている。ソース ストリーム ポインタそれぞれについて、出力コンテナ上の IMultiMediaStream::GetMediaStream メソッドを呼び出してこれらの出力ポインタを取得する。この処理は以下のステップで行われる。
フォーマットをサポートしないストリームそれぞれについて、これらのステップを繰り返す。両方のサンプルが更新を終了すると、ソース ストリームのデータがすべて出力ストリームに渡され、処理が完了する。