c++ - 如何在 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 消息,但如果可能的话,我想避免这种情况,以便从媒体基金会获得事件。
解决方案
您预计会成功MF_E_MULTIPLE_SUBSCRIBERS
,因为这里的订阅者是捕获引擎。IMFMediaEvent
引擎应该在内部处理事件并以扩展类型的形式将其转发给所有者MF_CAPTURE_ENGINE_ERROR
,HRESULT
代码由 (0xC00D3EA2) 的IMFMediaEvent::GetStatus
调用指示MF_E_VIDEO_RECORDING_DEVICE_INVALIDATED
:“视频录制设备不再存在。”。
您会在您的IMFCaptureEngineOnEventCallback
实现中收到事件,该事件在初始化步骤中提供给捕获引擎。
推荐阅读
- directx-11 - 对深度缓冲区进行采样并归一化为 [0,1] (DirectX)
- python - 从python中的循环中获取按钮名称
- php - 如果用户尝试在未登录的情况下直接链接,则显示错误消息
- sql-server - 当我打开 .sql 文件时,它无法识别我的旧表
- asp.net-mvc - 500 内部服务器错误 mvc ftp 发布方法
- c++ - 双端队列内存释放
- font-awesome - 我正在本地开发我的网络应用程序(文件://)并且来自 CDN 的图标不显示
- python - pyspark - 使用 RDD 进行聚合比 DataFrame 快得多
- hive - 蜂巢直线命令历史文件的路径是什么?
- python - 无法使用 Beautiful Soup 抓取网站