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

Unity3D Windows端使用Agora SDK枚举麦克风接口报错如何解决

问题根因

你遇到的两个返回值对应Agora SDK的标准错误码:

  • -10000000:对应ERR_NOT_READY,即音频设备模块未完成初始化就调用了设备操作接口
  • -2:对应ERR_INVALID_ARGUMENT,由于第一步未获取到合法的设备总数,传入的设备索引无效,自然无法返回设备名称和ID
正确实现流程

不要在RTC引擎刚初始化完成时立刻调用设备管理接口,按以下步骤实现:

  1. 完成RTC引擎初始化后,首先调用mRtcEngine.EnableAudio()显式开启音频模块,底层音频设备枚举是异步过程,需等待100-300ms再执行后续设备操作
  2. 等待完成后获取音频录制设备管理实例,再执行设备枚举、选择操作

可直接参考以下可运行代码:

using System.Collections;
using System.Collections.Generic;
using Agora.Rtc;
using UnityEngine;

public class AgoraMicManager : MonoBehaviour
{
    private IRtcEngine mRtcEngine;
    // 初始化RTC引擎完成后调用该方法
    public void StartMicEnum()
    {
        // 必须显式开启音频模块,否则底层不会加载音频设备管理能力
        mRtcEngine.EnableAudio();
        StartCoroutine(EnumAndSetMicrophone());
    }

    private IEnumerator EnumAndSetMicrophone()
    {
        // 等待底层完成音频设备初始化,可根据设备性能调整等待时长
        yield return new WaitForSeconds(0.2f);
        
        IAudioRecordingDeviceManager recordingManager = mRtcEngine.GetAudioRecordingDeviceManager();
        if (recordingManager == null)
        {
            Debug.LogError("recordingManager is null!");
            yield break;
        }

        int deviceCount = recordingManager.GetAudioRecordingDeviceCount();
        // 正常逻辑下deviceCount应大于0,若仍返回负错误码,参考后续踩坑点排查
        if (deviceCount <= 0)
        {
            Debug.LogError($"Get mic count failed, code: {deviceCount}");
            yield break;
        }

        List<string> micNameList = new List<string>();
        List<string> micIdList = new List<string>();
        for (int i = 0; i < deviceCount; i++)
        {
            string deviceName = "";
            string deviceId = "";
            int ret = recordingManager.GetAudioRecordingDeviceInfo(i, ref deviceName, ref deviceId);
            if (ret == 0)
            {
                micNameList.Add(deviceName);
                micIdList.Add(deviceId);
                Debug.Log($"Mic index:{i}, name:{deviceName}, id:{deviceId}");
            }
        }

        // 选择指定麦克风,传入对应设备的deviceId即可,频道内调用也可实时生效
        int targetMicIndex = 0; // 替换为需要选中的麦克风索引
        int setRet = recordingManager.SetAudioRecordingDevice(micIdList[targetMicIndex]);
        if (setRet == 0)
        {
            Debug.Log($"Switch mic success, current mic: {micNameList[targetMicIndex]}");
        }
    }
}
常见踩坑排查点
  • 不要在Unity Editor模式下验证设备枚举逻辑,编辑器环境下SDK音频模块和Windows独立构建版行为不一致,必须打Windows Standalone包测试
  • 检查系统麦克风权限:Windows 10/11需在「设置-隐私和安全性-麦克风」中开启「允许桌面应用访问麦克风」开关,否则SDK无法读取设备列表
  • 若设备安装了虚拟声卡、音频变声类软件并开启了麦克风独占模式,会导致SDK无法访问音频设备,暂时关闭这类软件后重试
  • 确认使用的是Agora 4.x正式版SDK,预览版存在设备管理接口初始化时序bug,会固定返回-10000000错误码
  • 若需要实时监听设备插拔事件,可在拿到recordingManager实例后注册OnAudioRecordingDeviceStateChanged回调,动态更新设备列表即可

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.09.01 19:03:31