[DirectShow このページに関連付けられている機能は、従来の機能です。 これは、 MediaPlayer、 IMFMediaEngine、 メディア ファンデーションの Audio/Video Captureに置き換えられました。 これらの機能は、Windows 10 および Windows 11 用に最適化されています。 新しいコードでは、可能な場合は、DirectShowではなく、Media Foundation で MediaPlayer、IMFMediaEngine、 Audio/Video Capture を使用することを強くお勧めします。 従来の API を使用する既存のコードは、可能であれば新しい API を使用するように書き直すよう提案しています。
DirectShow アプリケーションと同様に、DVD 再生アプリケーションはフィルター グラフを作成することから始まります。 DirectShow には、DVD 再生用に次のコンポーネントが用意されています。
- DVD グラフ ビルダー。 フィルター グラフを構築するヘルパー オブジェクト。 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を返す場合は、呼び出しが部分的に成功したことを意味します (ペシミストの場合は部分的に失敗しました)。 たとえば、他のストリームが正常にレンダリングされた場合でも、サブPICTURE ストリームのレンダリングに失敗する場合があります。 RenderDvdVideoVolume メソッドがエラー コードまたはS_FALSE値を返す場合は、AM_DVD_RENDERSTATUS 構造体を調べてエラーの詳細を確認できます。
次に、IDvdGraphBuilder::GetFiltergraphを呼び出して、フィルター グラフ マネージャーへのポインターを取得します。 このメソッドは、フィルター グラフ マネージャーの IGraphBuilder インターフェイスへのポインターを返します。
IGraphBuilder *pGraph = NULL;
hr = pBuild->GetFiltergraph(&m_pGraph);
IDvdGraphBuilder::GetDvdInterface メソッドを使用して、次のような DVD 関連のインターフェイスを取得します。
- 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 を呼び出し、そのレンダラーに固有のインターフェイスを要求して、レンダラーを選択します。
- オーバーレイ ミキサー フィルター: IDDrawExclModeVideo。
- ビデオ ミキシング レンダラー 7 (VMR-7): IVMRFilterConfig。
- ビデオ ミキシング レンダラー 9 (VMR-9): IVMRFilterConfig9。
- 拡張ビデオ レンダラー (EVR): IEVRFilterConfig。
フィルター グラフを作成する前にこれらのインターフェイスのいずれかを要求すると、DVD Graph Builder によって対応するビデオ レンダラーが作成されます。 後でグラフをビルドすると、DVD Graph Builder はそのレンダラーの使用を試みます。 ただし、選択したレンダラーを使用してグラフを作成できない場合は、別のレンダラーに切り替える可能性があります。 たとえば、MPEG-2 デコーダーが VMR フィルターと互換性がない場合、DVD Graph Builder は既定でオーバーレイ ミキサーになります。
これらのインターフェイスを使用すると、デコーダーに接続する前にレンダラーを構成することもできます。 たとえば、既定のウィンドウ モードではなくウィンドウレス モードを使用するように VMR を設定できます。 ビデオ レンダラーの詳細については、「DirectShowでのビデオ レンダリングについて」を参照してください。
Windows XP 以降では、DVD Graph Builder では、次の場合を除き、常に Video Mixing Renderer 7 (VMR-7) が使用されます。
- 呼び出し元のクエリ インターフェイスでは、IMixerPinConfig2など、オーバーレイ ミキサーのみが見つかりました。 これにより、アプリケーションが VMR ではなくオーバーレイ ミキサーを使用するヒントが DVD Graph Builder に送信されます。 Windows Media Player には、オーバーレイ ミキサーを強制的に使用するためのダイアログ ボックス オプションもあります。
- インストールされているデコーダーは VMR と互換性がありません。 グラフのビルド中、デコーダーのVMRサポートを確認するために、のIAMDecoderCapsインターフェイスが新しく使用されます。 存在しない場合、DVD Graph Builder はオーバーレイ ミキサーを使用します。
- ハードウェア デコーダーを使用している間、デコーダーは Video Port Manager (VPM) に接続できません。 ハードウェア デコーダーが VPM を使用できない場合は、VMR を使用できないため、DVD Graph Builder はオーバーレイ ミキサーを使用してグラフの作成を試みます。
- 表示カードには、VMR をサポートするためのリソースや機能が不十分であることがわかっていますが、ドライバーで正しく報告されません。 (一部の既知のケースは、DVD Graph Builder によって特に除外されます)。
- デコーダーと VMR の間の接続は、何らかの理由で失敗します。通常、必要なサーフェスを作成するための VRAM がないためです。 このような場合、DVD Graph Builder は VMR の使用をオフにし、オーバーレイ ミキサーを使用してグラフを作成しようとします。
ウィンドウ表示モード
ウィンドウ モード (オーバーレイ ミキサーまたは VMR) では、レンダラーによって独自のビデオ ウィンドウが作成されます。 このウィンドウをアプリケーション ウィンドウの子にするには、アプリケーションへのハンドルを使用して IVideoWindow::put_Owner を呼び出します。 また、レンダラーのビデオ ウィンドウに WS_CHILD および WS_CLIPSIBLINGS スタイルを設定するには、IVideoWindow::put_WindowStyle を呼び出します。 レンダラーのビデオ ウィンドウからマウス メッセージを取得するには、アプリケーション ウィンドウへのハンドルを使用して IVideoWindow::put_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 ナビゲーターに直接渡すことができます。
関連トピック