音频设备管理
更新时间: 2024/09/18 16:26:13
在音频场景中,您可能需要根据实际的场地情况选择采用音频的采集和播放设备,例如在室内场景中选用听筒进行音频播放。NERTC SDK 支持自由切换音频设备。
注意事项
耳机连接时,自动使用耳机播放。此时即使设置音频播放设备为扬声器或听筒,仍旧使用耳机播放,耳机断开连接时,恢复音频播放设备的配置。
实现方法
-
获取音频设备列表。
- 在初始化 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; }
- 调用
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();
- 在初始化 RTC SDK 后,调用
-
指定音频采集设备和播放设备。
调用
setRecordDevice
指定音频采集设备,调用setPlayoutDevice
指定音频播放设备。cpp
auto 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(); } //播放设备的设置类似,不再赘述
-
调节音量、静音。
指定音频采集设备和播放设备之后,就可以通过 AudioDeviceManager 提供的一系列 API 实现设备的静音、音量调节等功能。
cpp
//设置音频采集设备的音量 audio_device_manager->setRecordDeviceVolume(volume); //设置音频播放设备的音量 audio_device_manager->setPlayoutDeviceVolume(volume); //静音录制设备 audio_device_manager->setRecordDeviceMute(bMute); //静音播放设备 audio_device_manager->setPlayoutDeviceMute(bMute); ...
操作音量除了使用
setRecordDeviceVolume
或setPlayoutDeviceVolume
接口,还可以使用adjustRecordingSignalVolume
或adjustPlaybackSignalVolume
这对接口。二者的区别在于,前者修改的是设备音量,若其他应用程序也在使用当前设备,则会同样影响其他应用程序的声音大小。而后者只修改信号音量,不会影响其他应用程序。
-
获取设备状态。
- 调用
getRecordDeviceMute
获取音频采集设备、播放设备的静音状态。 - 调用
getPlayoutDeviceMute
获取音频播放设备的静音状态。 - 调用
getRecordDeviceVolume
获取音频采集设备的音量。 - 调用
getPlayoutDeviceVolume
获取音频播放设备的音量。
cpp
//获取录音设备是否静音 bool isRecordDeviceMute = false; audio_device_manager->getRecordDeviceMute(&isRecordDeviceMute); //获取录音设备音量 uint32_t volume = 0; audio_device_manager->getRecordDeviceVolume(&volume); ...
- 调用
-
音频设备测试。
在加入房间之前,我们经常会测试已设置的设备以确保其可用性和正常工作。您可以通过如下两种方式测试音频设备的可用性:
-
同时测试录音设备与播放设备。
调用
startAudioDeviceLoopbackTest
或stopAudioDeviceLoopbackTest
接口,可以将录音设备采集到的声音输送到播放设备,同时测试录音设备与播放设备。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();
-
此文档是否对你有帮助?