Как получить событие «Камера удалена» в MFCaptureEngine - PullRequest
0 голосов
/ 29 октября 2018

Есть ли возможность получить информацию о том, что камера была удалена во время предварительного просмотра в IMFCaptureEngine?

Я использую код из этого примера Образец захвата видео CaptureEngine . Существует EventCallback, связанный с экземпляром MFCaptureEngine:

    hr = m_pEngine->Initialize(m_pCallback, pAttributes, NULL, pUnk);

Но после удаления веб-камеры в функции обратного вызова не поступает никаких событий.

Я попытался добавить дополнительную функцию обратного вызова для IMFMediaSource движка, которая должна, как я ожидал, генерировать событие MEVideoCaptureDeviceRemoved. Посмотрите на код, вызываемый после инициализации экземпляра MFCaptureEngine:

    m_pEngine->GetSource(&pCapSource);
    pCapSource->GetCaptureDeviceSource(MF_CAPTURE_ENGINE_DEVICE_TYPE_VIDEO, &pMediaSource);
    pMediaSource.QueryInterface(&m_pSourceEventGenerator);
    hr = m_pSourceEventGenerator->BeginGetEvent(OnSourceCB, NULL);

Значение hr - MF_E_MULTIPLE_SUBSCRIBERS, что дает мне смысл, потому что есть смешанные два объекта обратного вызова (первый для MFCaptureEngine в целом, второй только для IMediaSource).

Почему я не получаю никакой информации об удаленном устройстве? Как я могу получить эту информацию?

PS. Я знаю сообщение WM_DEVICECHANGE, но я хотел бы избежать этого, если это возможно, чтобы получить событие от медиа-фонда.

1 Ответ

0 голосов
/ 29 октября 2018

Вы, как и ожидалось, нажали MF_E_MULTIPLE_SUBSCRIBERS, потому что это механизм захвата, который является подписчиком здесь. Предполагается, что механизм обрабатывает событие внутри и передает его владельцу в виде IMFMediaEvent расширенного типа MF_CAPTURE_ENGINE_ERROR, с кодом HRESULT, обозначенным IMFMediaEvent::GetStatus вызовом MF_E_VIDEO_RECORDING_DEVICE_INVALIDATED (0xC00D3EA2): "The устройства записи видео больше нет. ".

Вы получаете событие в вашей реализации IMFCaptureEngineOnEventCallback, предоставленное для захвата механизма на этапе инициализации.

...