Я играю видео, чтобы получить некоторые экраны с помощью DirectShow.Обнаружение конца видео с помощью IMediaSeeking
Я делаю это в цикле, вызывая IMediaControl->Run
, IVMRWindowlessControl->GetCurrentImage
, а затем IMediaSeeking->SetPositions
.
Проблема в том, что я не могу обнаружить, когда видео закончилось. IMediaSeeking->SetPositions
возвращает всегда одинаковое значение (S_FALSE). IMediaControl->Run
также возвращает всегда S_FALSE. Я также попробовал IMediaEvent->GetEvent
после звонка на IMediaControl->Run
, чтобы проверить на EC_COMPLETE
, но вместо этого возвращает (всегда) 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;
}
}
блоки после нескольких событий: 0x53 (EC_VMR_RENDERDEVICE_SET), 0x0D (EC_CLOCK_CHANGED), 0x0E (EC_PAUSED), следующий вызов GetEvent блокирует и видео оказываемых (воспроизводится по кадру) в моих IVideoWindow
Выполняется ли обработка событий DirectShow в отдельном потоке? –
На данный момент находится тот же поток, что и окно. – cprogrammer