是否有可能在 IMFCaptureEngine 中获取相机在预览期间被移除的信息?
我正在使用此示例中的代码 CaptureEngine video capture sample .有一个 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)。
为什么我没有得到有关设备已删除的任何信息?我怎样才能得到这些信息?
附言。我知道 WM_DEVICECHANGE 消息,但我想尽可能避免这种情况,以便从媒体基金会获得事件。
最佳答案
您应该会点击 MF_E_MULTIPLE_SUBSCRIBERS
,因为这里的订阅者是捕获引擎。引擎应该在内部处理事件并以扩展类型 MF_CAPTURE_ENGINE_ERROR
的 IMFMediaEvent
的形式将其转发给所有者,并指示 HRESULT
代码通过 IMFMediaEvent::GetStatus
调用 MF_E_VIDEO_RECORDING_DEVICE_INVALIDATED
(0xC00D3EA2):“视频录制设备不再存在。”。
您在初始化步骤中提供给捕获引擎的 IMFCaptureEngineOnEventCallback
实现中收到事件。
关于c++ - 如何在 MFCaptureEngine 中获取 "Camera removed"事件,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/53047242/