我正在播放视频以使用DirectShow获取一些屏幕。
我通过调用IMediaControl->Run
,IVMRWindowlessControl->GetCurrentImage
然后调用IMediaSeeking->SetPositions
来循环播放。
问题是我无法检测视频何时结束。 IMediaSeeking->SetPositions
始终返回相同的值(S_FALSE)。 IMediaControl->Run
也始终返回S_FALSE。在致电IMediaEvent->GetEvent
之后,我还尝试IMediaControl->Run
检查EC_COMPLETE
,但返回(始终)EC_CLOCK_CHANGED
。
如何检测视频结束?感谢
更新:执行类似
的操作 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;
}
}
几个事件后的块:0x53(EC_VMR_RENDERDEVICE_SET),0x0D(EC_CLOCK_CHANGED),0x0E(EC_PAUSED),对GetEvent的下一次调用是阻塞的,并且在IVideoWindow
答案 0 :(得分:2)
您应该IMediaEvent->GetEvent
,但请注意,您将收到各种活动,而不仅仅是EC_CLOCK_CHANGED
。继续接收,你将获得EC_COMPLETE
。 MSDN上的Step 6: Handle Graph Events详细说明了这一点。
答案 1 :(得分:1)
使用IMediaControl::GetState检查过滤器图形的状态,看它是否已停止。您还可以获得有用的IMediaSeeking::GetDuration视频的有效期。
另一种选择是使用event signaling。此事件处理可以是线程化的。