DirectShowを使用していくつかの画面を取得するためのビデオを再生しています。IMediaSeekingでビデオの終わりを検出する
私はIMediaControl->Run
、IVMRWindowlessControl->GetCurrentImage
、そしてIMediaSeeking->SetPositions
を呼び出すことでこれをループで実行しています。
問題は、ビデオが終了したときに検出できないことです。 IMediaSeeking->SetPositions
は常に同じ値(S_FALSE)を返します。 IMediaControl->Run
も常にS_FALSEを返します。私はまた、EC_COMPLETE
を確認するためにIMediaControl->Run
への呼び出しの後にIMediaEvent->GetEvent
を試しましたが、代わりに(常に)EC_CLOCK_CHANGED
を返します。
動画の最後を検出するにはどうすればよいですか?おかげ
UPDATE:こう何かのような
long eventCode = 0;
LONG_PTR ptrParam1 = 0;
LONG_PTR ptrParam2 = 0;
long timeoutMs = INFINITE;
while (SUCCEEDED(pEvent->GetEvent(&eventCode, &ptrParam1, &ptrParam1, timeoutMs)))
{
if (eventCode == EC_COMPLETE)
{
break;
}
// Free the event data.
hr = pEvent->FreeEventParams(eventCode, ptrParam1, ptrParam1);
if (FAILED(hr))
{
break;
}
}
ブロック数のイベントの後:$ 53(EC_VMR_RENDERDEVICE_SET)、0x0Dを(EC_CLOCK_CHANGED)、0x0Eの(EC_PAUSED)、のGetEventへの次の呼び出しをブロックしているとビデオがレンダリングされますIVideoWindow
DirectShowイベント処理は別のスレッドで実行されますか? –
現在のウィンドウと同じスレッドにあります。 – cprogrammer