在使用我们 SDK 时,开发者可以对 SDK 采集到的声音及 SDK 播放到声卡的声音音量进行调整,以满足产品在声音上的个性化需求。比如进行双人通话时,想实现静音操作,可以通过调整播放音量的接口将音量设置为 0。
本文梳理了在使用 SDK 从音频采集到播放各阶段中,用户可能需要调整音量的场景、各场景对应的 API 及其使用注意事项。
我们在 GitHub 上提供已实现调整采集和播放音量的开源示例项目 JoinChannelAudio.swift。你可以下载体验并参考源代码。
在调整通话音量前,请确保已在你的项目中实现基本的实时音视频功能。详见实现音视频通话或实现互动直播。
采集是指音频信号由采集设备采集后传输到发送端的过程。你可以通过设置采集设备音量或调节采集信号音量来设置采集音量。在 macOS 系统上,声网推荐使用音频设备相关 API 调节采集音量。
使用采集设备采集音频信号时,可调用 setDeviceVolume
方法设置采集设备音量。
该方法中 volume
参数表示采集设备的音量,取值范围为 [0,255]:
volume
的值与 macOS 系统中输入音量的值是一一对应的,255 对应于下图中输入音量调到最右:
示例代码
// swift
// 将采集设备音量设置为 50。
agoraKit.setDeviceVolume(.audioRecording, volume: 50)
// objective-c
// 将采集设备音量设置为 50。
[agoraKit setDeviceVolume: AgoraMediaDeviceTypeAudioRecording volume: 50];
如果调用 setDeviceVolume
方法设置的采集设备音量无法满足需求,你可以通过 adjustRecordingSignalVolume
或 adjustLoopbackRecordingSignalVolume
调节麦克风或声卡采集的信号幅度,从而调节采集音量。
volume
参数表示采集信号音量。取值范围为 [0,100]。默认值为 100,表示原始音量。
示例代码
// swift
// 将麦克风采集信号音量设置为 50。
agoraKit.adjustRecordingSignalVolume(50)
// 将声卡采集信号音量设置为 50。
agoraKit.adjustLoopbackRecordingSignalVolume(50)
// objective-c
// 将麦克风采集信号音量设置为 50。
[agoraKit adjustRecordingSignalVolume: 50];
// 将声卡采集信号音量设置为 50。
[agoraKit adjustLoopbackRecordingSignalVolume: 50];
播放是指音频信号从发送端进入到接收端,然后使用播放设备进行播放的过程。你可以通过设置播放设备音量或调整播放信号音量来设置采集音量。在 macOS 系统上,声网推荐使用音频设备相关 API 调节播放音量。
使用播放设备播放音频信号时,可调用 setDeviceVolume
方法设置播放设备音量。
该方法中 volume
参数表示播放设备的音量,取值范围为 [0,255]:
volume
的值与 macOS 系统中输出音量的值是一一对应的,255 对应下图中输出音量调到最右。
示例代码
// swift
// 将播放设备音量设置为 50。
agoraKit.setDeviceVolume(.audioPlayout, volume: 50)
// objective-c
// 将播放设备音量设置为 50。
[agoraKit setDeviceVolume: AgoraMediaDeviceTypeAudioPlayout volume: 50];
如果调用 setDeviceVolume
方法设置的播放设备音量无法满足需求,你可以通过 adjustPlaybackSignalVolume
方法或 adjustUserPlaybackSignalVolume
方法直接调节播放声音的信号幅度,由此实现调节播放的音量。
adjustPlaybackSignalVolume
:volume
参数表示播放音量,取值范围为 [0,400]。adjustUserPlaybackSignalVolume
:volume
参数表示播放音量,取值范围为 [0,100]。示例代码
// swift
// 将本地播放的所有远端用户音量设置为 50。
agoraKit.adjustPlaybackSignalVolume(50)
// 将本地播放的指定远端用户混音后的音量设置为 50。
agoraKit.adjustUserPlaybackSignalVolume(uid, volume: 50)
// objective-c
// 将本地播放的所有远端用户音量设置为 50。
[agoraKit adjustPlaybackSignalVolume: 50];
// 将本地播放的指定远端用户混音后的音量设置为 50。
[agoraKit adjustUserPlaybackSignalVolume: uid, volume: 50];
setDeviceVolume
adjustPlaybackSignalVolume
adjustUserPlaybackSignalVolume
adjustAudioMixingPlayoutVolume
在音频采集、混音、播放的整个过程中,你都可以使用下面的接口获取用户音量。
瞬时说话声音音量提示。reportAudioVolumeIndicationOfSpeakers
回调报告频道内瞬时音量最高的几个用户(即说话者)的用户 ID 及他们的音量。若返回的 uid
为 0,则表示返回的是本地用户的瞬时音量。
示例代码
// swift
// 获取瞬时说话音量最高的几个用户(即说话者)的用户 ID、他们的音量及本地用户是否在说话。
// @param speakers 为一个数组,包含说话者的用户 ID 、音量及本地用户人声状态。音量的取值范围为 [0, 255]。
// @param totalVolume 指混音后频道内的总音量,取值范围为 [0, 255]。
func rtcEngine(_ engine: AgoraRtcEngineKit, reportAudioVolumeIndicationOfSpeakers speakers:
[AgoraRtcAudioVolumeInfo], totalVolume: Int) {
}
// objective-c
// 获取瞬时说话音量最高的几个用户(即说话者)的用户 ID、他们的音量及本地用户是否在说话。
// @param speakers 为一个数组,包含说话者的用户 ID 、音量及本地用户人声状态。音量的取值范围为 [0,255]。
// @param totalVolume 指混音后频道内的总音量,取值范围为 [0,255]。
- (void)rtcEngine:(AgoraRtcEngineKit *_Nonnull)engine reportAudioVolumeIndicationOfSpeakers:(NSArray<AgoraRtcAudioVolumeInfo*> *_Nonnull)speakers totalVolume:(NSInteger)totalVolume {
}
监测到活跃用户提示。activeSpeaker
回调报告特定时间段内累积音量最高的用户 ID。如果返回的 uid
为 0,则默认为本地用户。
示例代码
// swift
// 获取当前时间段声音最大的用户 ID(仅 1 个)。
func rtcEngine(_ engine: AgoraRtcEngineKit, activeSpeaker speakerUid: UInt) {
}
// objective-c
// 获取当前时间段声音最大的用户 ID(仅 1 个)。
- (void)rtcEngine:(AgoraRtcEngineKit *_Nonnull)engine activeSpeaker:(NSUInteger)speakerUid {
}
由于硬件设备的限制,当使用调节信号设置音量的方法将音量设置过大时,在某些设备上可能会出现失真的声音效果。
实现调整通话音量过程中,你还可以参考如下文档: