音频设备管理

更新时间: 2024/03/15 17:14:53

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

注意事项

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

实现方法

  1. 获取音频设备列表。

    1. 在初始化 RTC SDK 后,调用 queryInterface 方法获得 AudioDeviceManager 实例。
    cpp
    ...
    auto ret = nertc_engine_->initialize(context);
    ...
    nertc::IAudioDeviceManager* audio_device_manager = nullptr;
    nertc_engine_->queryInterface(nertc::kNERtcIIDAudioDeviceManager, (void**)(&audio_device_manager));
    if (!audio_device_manager) {
    return;
    }
    
    1. 调用 enumerateRecordDevices方法获取音频采集设备的列表,调用 enumeratePlayoutDevices 方法获取播放设备的列表。
    cpp//录音设备的枚举
    auto record_collection = audio_device_manager->enumerateRecordDevices();
    if (!record_collection) {
        return;
    }
    uint16_t count = record_collection->getCount();
    if (count <= 0) {
        record_collection->destroy();
        return;
    }
    char device_name[kNERtcMaxDeviceNameLength]{ 0 };
    char device_id[kNERtcMaxDeviceIDLength]{ 0 };
    
    for (uint16_t i = 0; i < count; i++) {
        record_collection->getDevice(i, device_name, device_id);
        ... //例如,可在此处将device_name显示到UI中
    }
    record_collection->destroy();
    
    ...
    //播放设备的枚举
    auto playout_collection = audio_device_manager->enumeratePlayoutDevices();
    if (!playout_collection) {
        return;
    }
    uint16_t count = playout_collection->getCount();
    if (count <= 0) {
        playout_collection->destroy();
        return;
    }
    char device_name[kNERtcMaxDeviceNameLength]{ 0 };
    char device_id[kNERtcMaxDeviceIDLength]{ 0 };
    
    for (uint16_t i = 0; i < count; i++) {
        playout_collection->getDevice(i, device_name, device_id);
        ... //例如,可在此处将device_name显示到UI中
    }
    playout_collection->destroy();
    
  2. 指定音频采集设备和播放设备。

    调用 setRecordDevice指定音频采集设备,调用setPlayoutDevice指定音频播放设备。

    cppauto record_collection = audio_device_manager->enumerateRecordDevices();
    //假设我们想将系统的默认设备作为工作设备,需要先从record_collection获取系统默认设备的deivce_id
    if (record_collection) {
        int res;
        uint16_t device_count = record_collection->getCount();
        //遍历设备列表,获取设备信息,找到默认设备
        for (int idx = 0; idx < device_count; idx++) {
            NERtcDeviceInfo info;
            res = record_collection->getDeviceInfo(idx, &info);
            if (res == kNERtcNoError) {
                //找到默认设备
                if (info.system_default_device) {
                    //将录音设备的device_id设置给sdk。注意:不能将device_name传递给setRecordDevice
                    auto ret = audio_device_manager->setRecordDevice(info.device_id);
                }
            }
        }
        record_collection->destroy();
    }
    //播放设备的设置类似,不再赘述
    
  3. 调节音量、静音。

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

    cpp//设置音频采集设备的音量
    audio_device_manager->setRecordDeviceVolume(volume);
    //设置音频播放设备的音量
    audio_device_manager->setPlayoutDeviceVolume(volume);
    
    //静音录制设备
    audio_device_manager->setRecordDeviceMute(bMute);
    //静音播放设备
    audio_device_manager->setPlayoutDeviceMute(bMute);
    
    ...
    

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

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

  4. 获取设备状态。

    cpp//获取录音设备是否静音
    bool isRecordDeviceMute = false;
    audio_device_manager->getRecordDeviceMute(&isRecordDeviceMute);
    
    //获取录音设备音量
    uint32_t volume = 0;
    audio_device_manager->getRecordDeviceVolume(&volume);
    
    ...
    
  5. 音频设备测试。

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

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

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

      cpp//startAudioDeviceLoopbackTest接口同样会触发onLocalAudioVolumeIndication回调
      audio_device_manager->startAudioDeviceLoopbackTest(200);
      
      ...
      audio_device_manager->stopAudioDeviceLoopbackTest();
      
    • 分别测试录音设备与播放设备。

      cpp//请确保您在初始化SDK时正确指定了 nertc::NERtcEngineContext中event_handler的值,并重写了onLocalAudioVolumeIndication回调。
      
      //会前测试录音设备, 需指定音量指示回调的调用间隔,单位毫秒
      audio_device_manager->startRecordDeviceTest(200);
      
      void YourClass::onLocalAudioVolumeIndication(int volume, bool enable_vad) {
      //可以打印volume的值,以查看录音设备工作是否正常 ;enable_vad 为true时代表采集到了人声。
      ...
      }
      
      ...
      audio_device_manager->stopRecordDeviceTest();
      
      //会前测试播放设备,需准备一个本地的音频文件,用来播放。支持文件格式包括 wav、mp3、aac。
      audio_device_manager->startPlayoutDeviceTest("your audio file path in utf-8");
      
      //倾听播放设备是否有对应的声音播出
      ...
      audio_device_manager->stopPlayoutDeviceTest();
      
此文档是否对你有帮助?
有帮助
去反馈
  • 注意事项
  • 实现方法