ビデオ キャプチャでの再描画イベントの処理
[このページに関連付けられている機能 DirectShow は、従来の機能です。 MediaPlayer、IMFMediaEngine、および Media Foundation のオーディオ/ビデオ キャプチャに置き換わりました。 これらの機能は、Windows 10とWindows 11用に最適化されています。 新しいコードでは、可能であれば、DirectShow ではなく Media Foundation で MediaPlayer、IMFMediaEngine、Audio/Video Capture を使用することを強くお勧めします。 Microsoft は、従来の API を使用する既存のコードを、可能であれば新しい API を使用するように書き直すよう提案しています。]
ICaptureGraphBuilder2 インターフェイスを使用せずにビデオ キャプチャ グラフを作成し、古いビデオ レンダラー フィルターを使用してビデオをプレビューする場合は、EC_REPAINT イベントの既定の処理をオーバーライドする必要があります。 フィルター グラフ マネージャーで IMediaEvent インターフェイスに対してクエリを実行し、値をEC_REPAINTして IMediaEvent::CancelDefaultHandling メソッドを呼び出します。
IMediaEvent *pEvent = 0;
hr = pGraph->QueryInterface(IID_IMediaEvent, (void**)&pEvent);
if (SUCCEEDED(hr))
{
pEvent->CancelDefaultHandling (EC_REPAINT);
pEvent->Release();
}
これにより、キャプチャ ファイルが破損する可能性のあるエラーが回避されます。 ユーザーがプレビュー ウィンドウをカバーして明らかにした場合、ビデオ レンダラー フィルターはWM_PAINTメッセージを受信します。 既定では、ビデオ レンダラーは新しいフレームを要求し、フィルター グラフ マネージャーは別のビデオ フレームをキューするためにグラフを一時停止します。 グラフがファイルの書き込み中に発生すると、ファイルが破損します。 既定のEC_REPAINT動作をオーバーライドすると、レンダラーが新しいフレームを要求できなくなります。
ICaptureGraphBuilder2 インターフェイスを使用している場合は、この手順を実行する必要はありません。これは、Capture Graph Builder によって自動的に行われるためです。 また、プレビューに Video Mixing Renderer (VMR) を使用している場合は必須ではありません。 VMR は常に最新のフレームを使用できるため、EC_REPAINTイベントは送信されません。
関連トピック