c++ - 如何在 MFCaptureEngine 中获取 "Camera removed"事件

标签 c++ video-capture ms-media-foundation

是否有可能在 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_ERRORIMFMediaEvent 的形式将其转发给所有者,并指示 HRESULT 代码通过 IMFMediaEvent::GetStatus 调用 MF_E_VIDEO_RECORDING_DEVICE_INVALIDATED (0xC00D3EA2):“视频录制设备不再存在。”。

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

关于c++ - 如何在 MFCaptureEngine 中获取 "Camera removed"事件,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/53047242/

相关文章:

windows - ffmpeg : "Unable to BindToObject" 中无法列出捕获卡的选项

c++ - 将颜色从RGB转换为NV12

c++ - OOLua编译错误

c++ - 如何在 sndfile 中写入 24 位 pcm 样本?

linux - 如何将 2 个网络摄像头连接到 PC?

c - IMFTransform::ProcessOutput 返回 E_INVALIDARG

c++ - 如何在 IMFByteStream 接口(interface)中实现 `BeginRead`

c++ - 如何结束文件输出它的数据?

c++ - 如何从 Memory OutputStream 访问数据