Я играю видео, чтобы получить несколько экранов, используя 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