次の方法で共有


ビデオ キャプチャでの再描画イベントの処理

[このページに関連付けられている機能 DirectShow は、従来の機能です。 MediaPlayerIMFMediaEngine、および Media Foundation のオーディオ/ビデオ キャプチャに置き換わりました。 これらの機能は、Windows 10とWindows 11用に最適化されています。 新しいコードでは、可能であれば、DirectShow ではなく Media Foundation で MediaPlayerIMFMediaEngineAudio/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イベントは送信されません。

高度なキャプチャ に関するトピック

DirectShow でのイベント通知