通话音量监听
本文主要介绍如何通过 SDK 获取本地和远端用户在通话过程中的音量,进而判断用户是否在讲话。
实现方式是通过周期性调用 SDK 接口获取本地及远端音频 Track 的音量值,再通过音量值来判断用户是否在讲话
监听本地音量
SDK 提供了 QNLocalAudioTrack.getVolumeLevel 接口用于获取本地音频 Track 的音量。
以麦克风 Track 为例,可以通过如下方式实现对本地采集音量的感知:
mAudioVolumeTimer = new Timer();
mAudioVolumeTimer.scheduleAtFixedRate(new TimerTask() {
@Override
public void run() {
float localVolume = mMicrophoneAudioTrack.getVolumeLevel();
if (localVolume >= 0.1f) {
// 本地用户正在讲话
}
}
}, 0, GET_VOLUME_LEVEL_INTERVAL);
其中,GET_VOLUME_LEVEL_INTERVAL
为获取音量值的时间间隔,可根据您的场景自行定义其大小。
若用户通过 QNLocalAudioTrack.setMuted 将自己静音,由于该操作仅会静默推送出去的音频帧,并未停止音频采集,因此,仍可通过
getVolumeLevel
接口获取到有效的采集音量值。
监听远端音量
SDK 提供了 QNRemoteAudioTrack.getVolumeLevel 接口用于获取远端音频 Track 的音量。
可以通过如下方式实现对远端音频 Track 音量的感知:
mAudioVolumeTimer = new Timer();
mAudioVolumeTimer.scheduleAtFixedRate(new TimerTask() {
@Override
public void run() {
float remoteVolume = mRemoteAudioTrack.getVolumeLevel();
if (remoteVolume >= 0.1f) {
// 远端用户正在讲话
}
}
}, 0, GET_VOLUME_LEVEL_INTERVAL);
其中,GET_VOLUME_LEVEL_INTERVAL
为获取音量值的时间间隔,可根据您的场景自行定义其大小
语音激励
从 v5.2.6 版本开始,SDK 可通过 QNRTCClient.enableAudioVolumeIndication 接口开启语音激励功能。开启后,房间内用户的语音音量将会以从大到小的顺序,根据配置的时间间隔进行周期性的回调。使用示例如下:
mClient = QNRTC.createClient(new QNClientEventListener() {
@Override
public void onUserVolumeIndication(List<QNAudioVolumeInfo> userVolumeList) {
// 语音激励的回调通知,音量将以从大到小的顺序进行回调
}
});
mClient.enableAudioVolumeIndication(3000); // 配置语音激励回调间隔为 3000ms
其中,enableAudioVolumeIndication
的参数为指定的回调周期, ≤0 表示禁用该功能,>0 表示指定间隔,单位为 ms,默认关闭,最小取值为 100
注意:若是本地用户,则返回的音量列表中,QNVolumeInfo 中的 userID 字段将会为 ""
注意事项
- 在安静的环境下,获取到 0.3x 大小的数值可能为环境音的音量,是预期的现象,可根据需求自行决定判断用户是否讲话的音量阈值
- 本地音量获取的数值会受到 QNLocalAudioTrack.setVolume 接口的影响,在确定讲话阈值的时候需要搭配使用
- 获取音量接口为主动接口,需要您启动一个定时器,进行周期性的音量获取
示例代码
上述已经简单介绍了通话音量的监听方式,相对应的示例代码可参考 QNRTC-API-Examples。