音频设备管理

更新时间: 2024/03/15 17:20:45

在音频场景中,您可能需要根据实际的场地情况选择采用音频的采集和播放设备,例如在室内场景中选用听筒进行音频播放。NERTC SDK 支持自由切换音频设备。

注意事项

耳机连接时,自动使用耳机播放。此时即使设置音频播放设备为扬声器或听筒,仍旧使用耳机播放,耳机断开连接时,恢复音频播放设备的配置。

实现方法

  1. 获取音频设备列表。

    1. 在初始化 RTC SDK 后,调用 IRtcEngine.AudioDeviceManager 方法获得 IAudioDeviceManager 实例。
    cpp
    IRtcEngine rtcEngine = IRtcEngine.GetInstance();
    
    private void GetAudioDeviceManager(){
    
        var manager = rtcEngine.AudioDeviceManager;
        if(manager != null){ //仅桌面端支持
            //TODO:
        }
    }
    
    
    1. 调用 EnumerateRecordDevices方法获取录音设备列表,调用 EnumeratePlayoutDevices 方法获取播放设备列表。
    cppIRtcEngine rtcEngine = IRtcEngine.GetInstance();
    //枚举采集(麦克风)设备
    private void GetAudioRecordDevices()
    {
        var collection = rtcEngine.AudioDeviceManager.EnumerateRecordDevices();
        if(collection == null)
        {
            return;
        }
    
        for(int idx = 0; idx < collection.GetCount(); idx++)
        {
            string deviceId = null;
            string deviceName = null;
            int result = collection.GetDevice((ushort)idx, out deviceName, out deviceId);
            if(result != (int)RtcErrorCode.kNERtcNoError) //
            {
                continue;
            }
            //TODO:
        }
    
        collection.Destroy();
    }
    
    //枚举播放设备
    private void GetAudioPlaybackDevices()
    {
        var collection = rtcEngine.AudioDeviceManager.EnumeratePlayoutDevices();
        if (collection == null)
        {
            return;
        }
    
        for (int idx = 0; idx < collection.GetCount(); idx++)
        {
            string deviceId = null;
            string deviceName = null;
            int result = collection.GetDevice((ushort)idx, out deviceName, out deviceId);
            if (result != (int)RtcErrorCode.kNERtcNoError)
            {
                continue;
            }
    
            //TODO:
        }
    
        collection.Destroy();
    }
    
  2. 指定音频采集设备和播放设备。

    调用 SetRecordDevice指定音频采集设备,调用SetPlayoutDevice指定音频播放设备。

    cpp
    IRtcEngine rtcEngine = IRtcEngine.GetInstance();
    //设置采集设备
    private void SetRecordDevice()
    {
        //默认sdk自动选择设备
        rtcEngine.AudioDeviceManager.SetRecordDevice(RtcConstants.kNERtcAudioDeviceAutoID);
    
        //选择指定设备
        string deviceId = "YOUR SELECTED DEVICE ID";//通过枚举设备获得deviceId
        rtcEngine.AudioDeviceManager.SetRecordDevice(deviceId);
    }
    
    //设置采集设备
    private void SetPlayoutDevice()
    {
        //默认sdk自动选择设备
        rtcEngine.AudioDeviceManager.SetPlayoutDevice(RtcConstants.kNERtcAudioDeviceAutoID);
    
        //选择指定设备
        string deviceId = "YOUR SELECTED DEVICE ID";//通过枚举设备获得deviceId
        rtcEngine.AudioDeviceManager.SetPlayoutDevice(deviceId);
    }
    
    
  3. 操作音频设备。

    指定音频采集设备和播放设备之后,就可以通过 AudioDeviceManager 提供的一系列 API 操作音频设备,实现设备的静音、音量调节等功能。

    cpp
    IRtcEngine rtcEngine = IRtcEngine.GetInstance();
    private void SetDeviceVolume()
    {
        uint volume = 90;
        //设置音频采集设备的音量
        rtcEngine.AudioDeviceManager.SetRecordDeviceVolume(volume);
    
        //设置音频播放设备的音量
        rtcEngine.AudioDeviceManager.SetPlayoutDeviceVolume(volume);
    }
    
    //静音设备
    private void MuteDevice()
    {
        bool muted = true;
        //静音麦克风(桌面端)
        rtcEngine.AudioDeviceManager.SetRecordDeviceMute(muted);
        //静音扬声器(桌面端)
        rtcEngine.AudioDeviceManager.SetPlayoutDeviceMute(muted);
    
        //静音麦克风(桌面端、移动端)
        rtcEngine.SetRecordDeviceMute(muted);
        //静音扬声器(桌面端、移动端)
        rtcEngine.SetPlayoutDeviceMute(muted);
    }
    
    

    操作音量除了使用 SetRecordDeviceVolumeSetPlayoutDeviceVolume 接口,还可以使用AdjustRecordingSignalVolumeAdjustPlaybackSignalVolume这对接口。

    二者的区别在于,前者修改的是设备音量,若其他应用程序也在使用当前设备,则会同样影响其他应用程序的声音大小。而后者只修改信号音量,不会影响其他应用程序。

  4. 获取设备状态。

    cpp
    IRtcEngine rtcEngine = IRtcEngine.GetInstance();
    private void GetDeviceMute(){
        bool muted = false;
        //静音麦克风(桌面端)
        rtcEngine.AudioDeviceManager.GetRecordDeviceMute(ref muted);
        //静音扬声器(桌面端)
        rtcEngine.AudioDeviceManager.GetPlayoutDeviceMute(ref muted);
    
        //静音麦克风(桌面端、移动端)
        rtcEngine.GetRecordDeviceMute(ref muted);
        //静音扬声器(桌面端、移动端)
        rtcEngine.GetPlayoutDeviceMute(ref muted);
    }
    //获取设备音量(桌面端)
    private void GetDeviceVolume()
    {
        uint volume = 0;
        //获取音频采集设备的音量
        rtcEngine.AudioDeviceManager.GetRecordDeviceVolume(ref volume);
    
        //获取音频播放设备的音量
        rtcEngine.AudioDeviceManager.GetPlayoutDeviceVolume(ref volume);
    }
    
    
  5. 音频设备测试。

    在加入房间之前,我们经常会测试已设置的设备以确保其可用性和正常工作。您可以通过如下两种方式测试音频设备的可用性:

    • 同时测试录音设备与播放设备。

      调用 StartAudioDeviceLoopbackTestStopAudioDeviceLoopbackTest接口,可以将录音设备采集到的声音输送到播放设备,同时测试录音设备与播放设备。

      cpp//开始音频设备检测
      private void startAudioDeviceLoopbackTest()
      {
          //监听本端音量变化
          rtcEngine.OnLocalAudioVolumeIndication = OnLocalAudioVolumeIndicationHandler;
          rtcEngine.AudioDeviceManager.StartAudioDeviceLoopbackTest(1000);
      }
      private void OnLocalAudioVolumeIndicationHandler(int volume, bool enableVad)
      {
          //TODO:
      }
      
      //关闭音频设备检测
      private void stopAudioDeviceLoopbackTest()
      {
          rtcEngine.AudioDeviceManager.StopAudioDeviceLoopbackTest();
      }
      
    • 分别测试录音设备与播放设备

      cppIRtcEngine rtcEngine = IRtcEngine.GetInstance();
      private void startRecordDeviceTest()
      {
          //监听本端音量变化
          rtcEngine.OnLocalAudioVolumeIndication = OnLocalAudioVolumeIndicationHandler;
      
          //开启麦克风设备检测
          rtcEngine.AudioDeviceManager.StartRecordDeviceTest(1000);
      }
      
      private void OnLocalAudioVolumeIndicationHandler(int volume, bool enableVad)
      {
          //TODO:
      }
      //关闭麦克风检测
      private void stopRecordDeviceTest()
      {
          rtcEngine.AudioDeviceManager.StopRecordDeviceTest();
      }
      
      //扬声器设备检测
      private void startPlayoutDeviceTest()
      {
          //测试文件,如D:/test.mp3
          string testFile = "/path/to/file";
          rtcEngine.AudioDeviceManager.startPlayoutDeviceTest(testFile);
      }
      
      //关闭扬声器设备检测
      pri void stopPlayoutDeviceTest()
      {
          rtcEngine.AudioDeviceManager.StopPlayoutDeviceTest();
      }
      
此文档是否对你有帮助?
有帮助
去反馈
  • 注意事项
  • 实现方法