如何通过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++层面的编程实现方法。
- 视频流处理:借助k4a SDK可轻松获取相机的RGB+红外视频数据,但该SDK不支持访问麦克风阵列,因此使用WASAPI和多媒体API处理音频流。
- 设备标识获取:通过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和序列号不同。
- 麦克风端点枚举:使用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
相关产品推荐
相关产品推荐

