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

如何通过C/C++编程关联两台Azure Kinect的麦克风阵列与对应设备?

如何用C/C++关联两台Azure Kinect的麦克风阵列与对应相机

环境

  • Azure Kinect SDK 1.4.1
  • Windows 10

当前进展

我正在开发一款软件,用于录制连接到同一台计算机的两台Microsoft Azure Kinect的音视频流,核心需求是将同一设备的音视频流合并,因此需要确定哪个麦克风阵列属于哪台相机。目前已经可以通过Base Container ID关联单台Azure Kinect的4K相机、红外相机、麦克风阵列组件,但尚未找到C/C++层面的编程实现方法。

  1. 视频流处理:借助k4a SDK可轻松获取相机的RGB+红外视频数据,但该SDK不支持访问麦克风阵列,因此使用WASAPI和多媒体API处理音频流。
  2. 设备标识获取:通过SetupAPI相关函数可以查找Azure Kinect的ContainerID,并在DeviceInstanceID中提取序列号。以下是核心代码(省略错误检查与屏幕输出):
unsigned i=0;
HDEVINFO hDevInfo;
SP_DEVINFO_DATA DeviceInfoData;
TCHAR szDeviceInstanceID[MAX_DEVICE_ID_LEN];
TCHAR szDesc[1024], szHardwareIDs[4096];
WCHAR szBuffer[4096];

// 遍历设备列表,i为设备索引
DeviceInfoData.cbSize = sizeof(DeviceInfoData);
SetupDiEnumDeviceInfo(hDevInfo, i, &DeviceInfoData);
CM_Get_Device_ID(DeviceInfoData.DevInst, szDeviceInstanceID, MAX_PATH, 0);
// 此处可添加szDeviceInstanceID的输出代码

SetupDiGetDeviceRegistryProperty(hDevInfo, &DeviceInfoData, SPDRP_DEVICEDESC,
         &dwPropertyRegDataType, (BYTE*)szDesc, sizeof(szDesc), &dwSize);
// 此处可添加szDesc的输出代码
// ...
fn_SetupDiGetDevicePropertyW(hDevInfo, &DeviceInfoData,
      &DEVPKEY_Device_BusReportedDeviceDesc,
      &ulPropertyType, (BYTE*)szBuffer, sizeof(szBuffer), &dwSize, 0);
// 此处可添加szBuffer(BusReportedDeviceDesc)的输出代码
fn_SetupDiGetDevicePropertyW(hDevInfo, &DeviceInfoData,
      &DEVPKEY_Device_BaseContainerId,
      &ulPropertyType, (BYTE*)szDesc, sizeof(szDesc), &dwSize, 0);
StringFromGUID2((REFGUID)szDesc, szBuffer, ARRAY_SIZE(szBuffer));
// 此处可添加szBuffer(BaseContainerId)的输出代码
// 循环结束

上述代码的输出示例:

DeviceInstanceID ----USB\VID_045E&PID_097D&MI_02\8&904C5FF&0&0002
    Device Description: WinUsb Device
    Bus Reported Device Description: Azure Kinect 4K Camera
    BaseContainerId: {A60ED20F-7C3B-4B20-AF2F-77E5987FC5E0}

DeviceInstanceID ----USB\VID_045E&PID_097C\000591600112
    Device Description: WinUsb Device
    Bus Reported Device Description: Azure Kinect Depth Camera
    BaseContainerId: {A60ED20F-7C3B-4B20-AF2F-77E5987FC5E0}

DeviceInstanceID ----USB\VID_045E&PID_097D&MI_00\8&904C5FF&0&0000
    Device Description: USB Video Device
    Bus Reported Device Description: Azure Kinect 4K Camera
    BaseContainerId: {A60ED20F-7C3B-4B20-AF2F-77E5987FC5E0}

DeviceInstanceID ----USB\VID_045E&PID_097E&MI_00\8&177D8328&0&0000
    Device Description: USB Audio 2.0
    Bus Reported Device Description: Azure Kinect Microphone Array
    BaseContainerId: {A60ED20F-7C3B-4B20-AF2F-77E5987FC5E0}

以上数据属于单台Azure Kinect(共享同一BaseContainerId),其序列号包含在第二条DeviceInstanceID中(000591600112)。另一台Azure Kinect的数据结构类似,但BaseContainerId和序列号不同。

  1. 麦克风端点枚举:使用WASAPI枚举音频捕获设备的核心代码如下:
IMMDeviceEnumerator *deviceEnumerator = NULL;
IMMDeviceCollection *deviceCollection = NULL;
IMMDevice *device = NULL;

CoCreateInstance(__uuidof(MMDeviceEnumerator), NULL, CLSCTX_INPROC_SERVER, 
                 IID_PPV_ARGS(&deviceEnumerator));
deviceEnumerator->EnumAudioEndpoints(eCapture, DEVICE_STATE_ACTIVE,
                 &deviceCollection);
// 遍历音频设备(i为索引)
        LPWSTR deviceName;
        deviceName = GetDeviceName(deviceCollection, i);
        device->GetId(&deviceid); 
        device->OpenPropertyStore(STGM_READ,&propstore);
        propstore->GetValue(PKEY_Device_FriendlyName ,&propvari);
        // 检查是否为Azure Kinect Microphone Array

输出示例:

device name:Microphone Array (Azure Kinect Microphone Array) 
                       ({0.0.1.00000000}.{002466ae-4a3f-432c-8bae-1c3ddc8fc1f8})

device name:Microphone Array (2- Azure Kinect Microphone Array) 
                       ({0.0.1.00000000}.{0ae6a82f-5a3f-4ece-a618-80aafecb8fe8})

device name:Microphone Array (Realtek(R) Audio) 
                       ({0.0.1.00000000}.{b279e826-ffb8-465e-87d8-fe40db70cdf3})

问题

已检查多媒体和设备属性中的所有GUID与ID,但仍未找到关联麦克风阵列与对应Azure Kinect设备的C/C++编程方法,寻求技术提示。


内容的提问来源于stack exchange,提问作者Jens

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.29 16:45:16