如何用C++/WinRT修改Windows Hello红外相机InfraredTorchControl模式
Windows Hello红外相机红外Torch控制问题
测试环境
- 操作系统:Windows 11 Home 22H2
- 红外相机:NexiGo HelloCam N930W Camera
- 开发环境:Visual Studio 2022
- 编程语言:C++ 20
- 应用类型:Windows桌面应用(C++/Winrt)[非通用Windows应用][Xaml UI]
- 源码地址:https://github.com/andresbeltranc/ir_camera_sample_win32
背景
Windows Hello相机结合红外摄像头与红外发射器实现帧深度感知,原理类似苹果FaceID或Xbox Kinect,这种深度感知能力对开发者和研究者极具价值。我已开发出可访问Windows Hello红外相机的应用,但红外发射器行为不稳定。
问题
我能获取红外相机的每一帧,但无法开启红外发射LED(Infrared Torch),而Windows Hello人脸识别时该功能可正常工作。
Windows红外相机驱动层面的红外Torch模式包括:
| Torch模式 | 描述 |
|---|---|
| KSCAMERA_EXTENDEDPROP_IRTORCHMODE_OFF | 关闭 |
| KSCAMERA_EXTENDEDPROP_IRTORCHMODE_ALWAYS_ON | 常亮 |
| KSCAMERA_EXTENDEDPROP_IRTORCHMODE_ALTERNATING_FRAME_ILLUMINATION | 隔帧开启 |
注:红外Torch行为因相机而异,部分相机默认模式为「隔帧开启」,但NexiGo HelloCam N930W默认关闭,需手动开启。
理论上可通过Media Foundation API的InfraredTorchControl类修改模式,代码如下:
auto infraredTorchControl = m_mediaCapture.VideoDeviceController().InfraredTorchControl(); if(infraredTorchControl.IsSupported()){ infraredTorchControl.CurrentMode(winrt::Windows::Media::Devices::InfraredTorchMode::On); }
但调用API时提示InfraredTorchControl不支持。查阅VideoDeviceController文档得知,部分驱动要求相机处于预览状态才能识别支持的控件,因此尝试三种解决方案均失败:
- Windows桌面应用(C++/WinRT):尝试通过CaptureElement绑定MediaCapture并启动预览,抛出错误
WinRT originate error: 'Input format unsupported'.和WinRT originate error: 'No suitable transform was found to encode or decode the content.',推测原因是CaptureElement不支持红外相机的L8格式。 - 通用Windows应用(C++/WinRT):使用XAML的CaptureElement绑定MediaCapture,仍出现相同错误。
- 自定义Media Sink:尝试通过MediaCapture的
StartPreviewToCustomSinkAsync方法绑定自定义媒体接收器,但缺乏C++/WinRT相关文档,无法成功转换C++/CX示例代码。
问询
现寻求有效修改Windows Hello红外相机InfraredTorchControl模式的方案,同时希望解答以下问题:
- 为何修改参数需要启动预览?
- Media Foundation是否支持红外相机预览?
- 如何实现C++/WinRT版自定义Media Sink?
- 是否可通过DeviceMFT直接访问驱动?
内容的提问来源于stack exchange,提问作者Andres Beltran
相关产品推荐
相关产品推荐

