You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何在Windows系统中访问Windows Hello红外摄像头视频流

访问Windows Hello红外摄像头视频流方案

Win32 C/C++(基于Media Foundation)

Windows Hello的红外摄像头通常会被系统识别为独立捕获设备,或是RGB摄像头的附加流。以下是基于Media Foundation的实现步骤:

  1. 枚举并筛选红外设备
    使用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;
}
  1. 初始化捕获会话
    针对筛选出的红外设备,创建媒体源并构建捕获拓扑,启动媒体会话即可获取红外流。注意红外流多为灰度格式,需对应调整解码或显示逻辑。

C#/.NET(基于Windows.Media.Capture)

在UWP/WinUI或.NET 5+桌面应用中,可通过Windows.Media.Capture API访问红外流:

  1. 查找红外帧源组
    通过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;
}
  1. 启动红外捕获
    初始化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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.20 04:40:25