首页 > 解决方案 > 如何在 MFCaptureEngine 中获取“相机已移除”事件

问题描述

是否有可能在 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 消息,但如果可能的话,我想避免这种情况,以便从媒体基金会获得事件。

标签: c++video-capturems-media-foundation

解决方案


您预计会成功MF_E_MULTIPLE_SUBSCRIBERS,因为这里的订阅者是捕获引擎。IMFMediaEvent引擎应该在内部处理事件并以扩展类型的形式将其转发给所有者MF_CAPTURE_ENGINE_ERRORHRESULT代码由 (0xC00D3EA2) 的IMFMediaEvent::GetStatus调用指示MF_E_VIDEO_RECORDING_DEVICE_INVALIDATED:“视频录制设备不再存在。”。

您会在您的IMFCaptureEngineOnEventCallback实现中收到事件,该事件在初始化步骤中提供给捕获引擎。


推荐阅读