如何在Windows系统中访问Windows Hello红外摄像头视频流
访问Windows Hello红外摄像头视频流方案
Win32 C/C++(基于Media Foundation)
Windows Hello的红外摄像头通常会被系统识别为独立捕获设备,或是RGB摄像头的附加流。以下是基于Media Foundation的实现步骤:
- 枚举并筛选红外设备
使用MFEnumDeviceSources枚举所有视频捕获设备,遍历设备属性筛选红外设备:
- 检查设备友好名称是否包含
IR/Infrared关键字 - 验证媒体类型子类型是否为
MFVideoFormat_IRM1(常见红外格式)或MFVideoFormat_Y16(16位灰度红外)
示例代码片段:
HRESULT EnumerateInfraredDevices(IMFActivate** ppDevices, UINT32* pcDevices) { *ppDevices = nullptr; *pcDevices = 0; HRESULT hr = MFStartup(MF_VERSION); if (FAILED(hr)) return hr; IMFAttributes* pAttributes = nullptr; hr = MFCreateAttributes(&pAttributes, 1); if (SUCCEEDED(hr)) { hr = pAttributes->SetGUID(MF_DEVSOURCE_ATTRIBUTE_SOURCE_TYPE, MF_DEVSOURCE_ATTRIBUTE_SOURCE_TYPE_VIDCAP_GUID); if (SUCCEEDED(hr)) { hr = MFEnumDeviceSources(pAttributes, ppDevices, pcDevices); // 遍历设备筛选红外设备 for (UINT32 i = 0; i < *pcDevices; i++) { WCHAR szFriendlyName[256] = {0}; (*ppDevices)[i]->GetString(MF_DEVSOURCE_ATTRIBUTE_FRIENDLY_NAME, szFriendlyName, ARRAYSIZE(szFriendlyName), nullptr); if (wcsstr(szFriendlyName, L"IR") != nullptr || wcsstr(szFriendlyName, L"Infrared") != nullptr) { // 标记或保留该红外设备 } } } } SafeRelease(&pAttributes); MFShutdown(); return hr; }
- 初始化捕获会话
针对筛选出的红外设备,创建媒体源并构建捕获拓扑,启动媒体会话即可获取红外流。注意红外流多为灰度格式,需对应调整解码或显示逻辑。
C#/.NET(基于Windows.Media.Capture)
在UWP/WinUI或.NET 5+桌面应用中,可通过Windows.Media.Capture API访问红外流:
- 查找红外帧源组
通过MediaFrameSourceGroup.FindAllAsync枚举所有帧源组,筛选包含红外帧源的组:
示例代码片段:
using Windows.Media.Capture; using Windows.Media.Capture.Frames; async Task<MediaFrameSourceGroup> FindInfraredSourceGroupAsync() { var groups = await MediaFrameSourceGroup.FindAllAsync(); foreach (var group in groups) { foreach (var sourceInfo in group.SourceInfos) { if (sourceInfo.MediaStreamType == MediaStreamType.VideoPreview && sourceInfo.SourceKind == MediaFrameSourceKind.Infrared) { return group; } } } return null; }
- 启动红外捕获
初始化MediaCapture对象并指定红外源组,随后启动预览并处理帧数据:
async Task StartInfraredCaptureAsync() { var infraredGroup = await FindInfraredSourceGroupAsync(); if (infraredGroup == null) return; var captureSettings = new MediaCaptureInitializationSettings { SourceGroup = infraredGroup, StreamingCaptureMode = StreamingCaptureMode.Video, MediaCategory = MediaCategory.Communications }; var mediaCapture = new MediaCapture(); await mediaCapture.InitializeAsync(captureSettings); // 获取红外帧源并启动预览 var infraredSource = mediaCapture.FrameSources[infraredGroup.SourceInfos.First(s => s.SourceKind == MediaFrameSourceKind.Infrared).Id]; await mediaCapture.StartPreviewAsync(); // 注册帧到达事件处理数据 infraredSource.FrameArrived += (s, e) => { using (var frame = s.TryGetFrame()) { var softwareBitmap = frame.SoftwareBitmap; // 后续显示或处理灰度红外帧逻辑 } }; }
注意事项
- 需确保应用拥有摄像头权限:Win32应用需在清单中声明摄像头权限,UWP/WinUI应用需在Package.appxmanifest中添加
<DeviceCapability Name="webcam"/> - 红外流多为灰度格式(如Y8、Y16),需对应调整显示或处理逻辑
- 部分红外摄像头可能需要系统授予基础权限,普通流访问通常仅需摄像头权限
内容的提问来源于stack exchange,提问作者user3256556
相关产品推荐
相关产品推荐

