DVD フィルター グラフの作成

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

DirectShow アプリケーションと同様に、DVD 再生アプリケーションはフィルター グラフを作成することから始まります。 DirectShow には、DVD 再生用の次のコンポーネントが用意されています。

  • DVD Graph Builder。 フィルター グラフを構築するヘルパー オブジェクト。 IDvdGraphBuilder インターフェイスを公開します。
  • DVD ナビゲーター フィルター。 DVD 再生、ナビゲーション、およびその他のコマンドを処理する DirectShow フィルター。

DVD 再生には MPEG-2 デコーダーも必要です。 ハードウェアおよびソフトウェア MPEG-2 デコーダーは、サード パーティから入手できます。 まず、DVD Graph Builder オブジェクトのインスタンスを作成します。

IDvdGraphBuilder *pBuild = NULL;
hr = CoCreateInstance(CLSID_DvdGraphBuilder, NULL, 
    CLSCTX_INPROC_SERVER, IID_IDvdGraphBuilder, (void **)&pBuild);

この時点で、グラフの残りの部分を作成する前に、ビデオ レンダラーを選択して構成できます。 この手順 (省略可能) については、次のセクションで詳しく説明します。 この手順を省略すると、DVD Graph Builder によって既定のレンダラーが選択されます。 次に、 IDvdGraphBuilder::RenderDvdVideoVolume メソッドを呼び出してグラフをビルドします。

AM_DVD_RENDERSTATUS buildStatus;
hr = pBuild->RenderDvdVideoVolume(L"Z:\\video_ts", 0, &buildStatus);

最初のパラメーターは、DVD ファイルを含むディレクトリの名前です。 DVD ディスクでは、これらのファイルは VIDEO_TS という名前のディレクトリに存在します。 最初のパラメーターが NULL の場合、DVD Graph Builder は DVD ボリュームを含む最初のドライブを使用します。

2 番目のパラメーターには、デコーダーの種類 (ハードウェアまたはソフトウェア) とその他のオプションを選択するためのさまざまな省略可能なフラグが含まれています。

3 番目のパラメーターは、状態情報を受け取る AM_DVD_RENDERSTATUS 構造体です。 RenderDvdVideoVolume メソッドがS_FALSEを返す場合は、呼び出しが部分的に成功したことを意味します (ペシミストの場合は部分的に失敗)。 たとえば、 メソッドは、他のストリームが正常にレンダリングされた場合でも、サブ画像ストリームのレンダリングに失敗する可能性があります。 RenderDvdVideoVolume メソッドがエラー コードまたはS_FALSE値を返す場合は、AM_DVD_RENDERSTATUS構造を調べてエラーの詳細を確認できます。

次に、 IDvdGraphBuilder::GetFiltergraph を呼び出して、フィルター グラフ マネージャーへのポインターを取得します。 このメソッドは、フィルター グラフ マネージャーの IGraphBuilder インターフェイスへのポインターを返します。

IGraphBuilder *pGraph = NULL;
hr =  pBuild->GetFiltergraph(&m_pGraph);

次のような DVD 関連のインターフェイスを取得するには、 IDvdGraphBuilder::GetDvdInterface メソッドを使用します。

  • IDvdControl2。 再生と DVD コマンドを制御します
  • IDvdInfo2。 DVD ナビゲーターの現在の状態に関する情報を返します。
  • IAMLine21Decoder。 コントロールを閉じてキャプション表示します。 閉じたキャプション表示は既定で有効になっています。 無効にするには、AM_L21_CCSTATE_Off フラグを指定して IAMLine21Decoder::SetServiceState を呼び出します。
  • IBasicAudio。 オーディオの音量とバランスを制御します。

たとえば、次のコードは IDvdControl2 インターフェイスを返します。

IDvdControl2 *pDvdControl = NULL;
hr = pBuild->GetDvdInterface(IID_IDvdControl2, (void**)&pDvdControl);

DVD 再生フィルター グラフを構築する推奨される方法は、 DVD Graph Builder オブジェクトに自動的に実行してもらう方法です。 この方法は、以下と DVD サンプル アプリケーションで示されています。 DVD フィルター グラフを手動で作成する必要がある場合は、DirectShow ドキュメントの他の場所で説明されているグラフ作成の基本的な規則に従って作成できます。 一般に、DVD Graph Builder によって作成されたグラフ内の個々のフィルターを手動で追加、削除、接続、または切断しないでください。これは、クリーンアップ コードが混同される可能性があるためです。

ビデオ レンダラーの構成

DirectShow には、いくつかのビデオ レンダラー フィルターが用意されています。 グラフを作成する前に、使用するビデオ レンダラーを選択できます。 IDvdGraphBuilder::GetDvdInterface を呼び出し、そのレンダラーに固有のインターフェイスを要求して、レンダラーを選択します。

フィルター グラフを構築する前にこれらのインターフェイスのいずれかを要求すると、DVD Graph Builder によって対応するビデオ レンダラーが作成されます。 後でグラフを作成すると、DVD Graph Builder はそのレンダラーの使用を試みます。 ただし、選択したレンダラーを使用してグラフを作成できない場合は、別のレンダラーに切り替える可能性があります。 たとえば、MPEG-2 デコーダーは VMR フィルターと互換性がない場合があります。この場合、DVD Graph Builder は既定でオーバーレイ ミキサーに設定されます。

これらのインターフェイスを使用すると、デコーダーに接続する前にレンダラーを構成することもできます。 たとえば、既定のウィンドウ モードではなく、ウィンドウレス モードを使用するように VMR を設定できます。 ビデオ レンダラーの詳細については、「 DirectShow でのビデオ レンダリングについて」を参照してください。

Windows XP 以降では、DVD Graph Builder では、次の場合を除き、 ビデオ ミキシング レンダラー 7 (VMR-7) が常に使用されます。

  • 呼び出し元のクエリ インターフェイスでは、IMixerPinConfig2 などのオーバーレイ ミキサーのみが見つかりました。 これにより、アプリケーションが VMR ではなくオーバーレイ ミキサーを使用するヒントが DVD Graph Builder に送信されます。 Windows メディア プレーヤーには、オーバーレイ ミキサーを強制的に使用するためのダイアログ ボックス オプションもあります。
  • インストールされているデコーダーは VMR 互換ではありません。 グラフのビルド中に、デコーダーの VMR サポートをチェックするために、新しい IAMDecoderCaps インターフェイスが使用されます。 存在しない場合、DVD Graph Builder はオーバーレイ ミキサーを使用します。
  • ハードウェア デコーダーを使用している間、デコーダーは ビデオ ポート マネージャー (VPM) に接続できません。 ハードウェア デコーダーで VPM を使用できない場合は、VMR を使用できないため、DVD Graph Builder はオーバーレイ ミキサーを使用してグラフの作成を試みます。
  • 表示カードには、VMR をサポートするためのリソースや機能が不十分であることがわかっていますが、ドライバーで正しく報告されません。 (一部の既知のケースは、DVD Graph Builder によって特に除外されています)。
  • デコーダーと VMR の間の接続は、何らかの理由で失敗します。通常は、必要なサーフェスを作成するための VRAM がないためです。 このような場合、DVD Graph Builder は VMR の使用をオフにし、オーバーレイ ミキサーを使用してグラフを作成しようとします。

ウィンドウ モード

ウィンドウ モード (オーバーレイ ミキサーまたは VMR) では、レンダラーによって独自のビデオ ウィンドウが作成されます。 このウィンドウをアプリケーション ウィンドウの子にするには、アプリケーションへのハンドルを使用 して IVideoWindow::p ut_Owner を呼び出します。 また 、IVideoWindow::p ut_WindowStyle を呼び出して、レンダラーのビデオ ウィンドウにWS_CHILDスタイルとWS_CLIPSIBLINGSスタイルを設定します。 レンダラーのビデオ ウィンドウからマウス メッセージを取得するには、アプリケーション ウィンドウへのハンドルを使用 して IVideoWindow::p ut_MessageDrain を呼び出します。 このメソッドは、"メッセージ ドレイン" を設定します。ビデオ ウィンドウは、受信したすべてのマウス メッセージをメッセージ ドレイン ウィンドウに転送します。

pVideoWindow->put_Owner((OAHWND)hwnd);
pVideoWindow->put_WindowStyle(WS_CHILD | WS_CLIPSIBLINGS);
pVideoWindow->put_MessageDrain((OAHWND)hwnd) ;

メッセージドレインはDVDメニューボタンの選択をやや複雑にします。 ビデオ ウィンドウがアプリケーションのクライアント領域全体を満たしていない場合、一部のマウス イベントはビデオ ウィンドウの外側に表示されます。 ビデオ ウィンドウ からマウス イベントを取得したら、DVD メニュー ナビゲーション用に処理する必要があります。 ビデオ ウィンドウ の外部 からのマウス イベントは処理しないでください。 メッセージのドレインでは、2 つを区別する方法はありません。 さらに、ビデオ ウィンドウからのマウス イベントの座標は、ビデオ ウィンドウのクライアント領域に対して相対的です。ただし、ビデオ ウィンドウの外部からのマウス イベントは、アプリケーションのクライアント領域に対して相対的です。

ウィンドウレス モード

ウィンドウレス モードでは、マウス メッセージに関する問題が完全に回避されます。 VMR (または EVR) はウィンドウレス モードで独自のウィンドウを作成しないため、メッセージ ドレインは必要ありません。 代わりに、アプリケーション ウィンドウに直接描画されます。 コピー先の四角形がアプリケーション クライアント領域よりも小さい場合、DVD ナビゲーターは DVD ボタンの位置を計算するときにこれを考慮します。 したがって、マウス メッセージが表示されたら、「メニュー ナビゲーション」セクションで説明されているように、座標を DVD ナビゲーターに直接渡すことができます。

DVD アプリケーション