使用IMediaSeeking检测视频结束

时间:2012-01-23 17:47:45

标签: c++ directx directshow

我正在播放视频以使用DirectShow获取一些屏幕。

我通过调用IMediaControl->RunIVMRWindowlessControl->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

2 个答案:

答案 0 :(得分:2)

您应该IMediaEvent->GetEvent,但请注意,您将收到各种活动,而不仅仅是EC_CLOCK_CHANGED。继续接收,你将获得EC_COMPLETE。 MSDN上的Step 6: Handle Graph Events详细说明了这一点。

答案 1 :(得分:1)

使用IMediaControl::GetState检查过滤器图形的状态,看它是否已停止。您还可以获得有用的IMediaSeeking::GetDuration视频的有效期。

另一种选择是使用event signaling。此事件处理可以是线程化的。