音频裸数据混音
本文主要介绍连麦过程中添加 PCM 音频裸数据混音的使用场景。
- 从 v5.2.6 版本开始,QNAudioSourceMixer 需要通过 QNRTC.createAudioSourceMixer 接口创建,并通过 QNLocalAudioTrack.addAudioFilter 的方式进行关联。将不再支持通过 QNMicrophoneAudioTrack.createAudioSourceMixer 创建
- v5.2.0 版本开始支持使用 QNAudioSourceMixer 进行 PCM 裸数据的混音操作
使用方式如下:
创建 QNAudioSourceMixer
SDK 支持对不同的音频 Track 设置混音控制器,可以通过 QNRTC.createAudioSourceMixer 来创建 QNAudioSourceMixer 对象,再通过 QNLocalAudioTrack.addAudioFilter 的方式进行混音控制器的关联。
QNAudioSourceMixer audioSourceMixer = QNRTC.createAudioSourceMixer(mAudioSourceMixerListener); // 创建音源混音控制器
localAudioTrack.addAudioFilter(audioSourceMixer); // 关联音源混音控制器
其中,QNAudioSourceMixerListener 为 PCM 混音回调代理,回调方法定义如下:
public interface QNAudioSourceMixerListener {
/**
* 音源混音发生错误时回调
*
* @param errorCode 错误码
* @param errorMessage 错误信息
*/
void onError(int errorCode, String errorMessage);
}
混音场景下的错误码可参考混音相关错误码
若需移除音频 Track 上的音源混音控制器,可通过 QNLocalAudioTrack.removeAudioFilter 的方式进行音源混音控制器的移除,使用代码参考如下:
localAudioTrack.removeAudioFilter(audioSourceMixer); // 移除音源混音控制器
注意:同一个音源混音控制器只能关联一个音频 Track,重复添加将会失败。
创建 QNAudioSource
QNAudioSource 为音源配置类,支持两种创建方式:
- QNAudioSourceMixer.createAudioSource[1/2]:通过非阻塞模式创建
QNAudioSource
- QNAudioSourceMixer.createAudioSource[2/2]:通过指定阻塞模式创建
QNAudioSource
使用代码参考如下:
// 非阻塞模式
QNAudioSource audioSource = mAudioSourceMixer.createAudioSource(sourceID);
// 阻塞模式
QNAudioSource audioSource = mAudioSourceMixer.createAudioSource(sourceID, true);
阻塞模式的配置决定了 SDK 是否会阻塞数据导入的线程:
- 非阻塞模式下,外部数据需要按照每次送入音频数据的时长间隔依次送入,或者直接使用播放器解码后的回调数据来送入,但不宜送入过快,以免丢弃过多的数据。
- 阻塞模式下,外部数据需要持续送入 SDK,但不宜送入太多,以免阻塞导入线程的时间过长。
其中,sourceID 为音源文件的唯一标识符,可自行生成并维护,该标识符为控制一系列音源混音操作的依据,需保证唯一。
数据导入
在创建 QNAudioSource 之后,便可以通过 QNAudioSourceMixer.pushAudioFrame 接口基于 sourceID 进行 PCM 混音数据的导入。
参考代码如下:
mAudioSourceMixer.pushAudioFrame(sourceID, frame); // 导入待混音的 pcm 数据
其中,frame 为 QNAudioFrame 的对象实例,可以在构造对象实例时指定 pcm 数据的 buffer、采样率、位宽和声道数等信息。
推送控制
SDK 混音功能默认会将混音数据推送至远端。
SDK 支持配置音源混音是否需要推送至远端,若关闭推送,则音源混音将只做本地播放,配置接口如下:
mAudioSourceMixer.setPublishEnabled(audioSource.getID(), false); // 设置指定音源的不发布到远端,仅在本地播放
音量控制
混音场景下,主要包含三种音量设置:麦克风混音音量、音源混音音量、本地播放音量。三种音量的设置方式参考如下:
- 麦克风混音音量:可以通过 QNMicrophoneAudioTrack.setVolume 接口进行配置。
- 音源混音音量:可以通过 QNAudioSourceMixer.setVolume 和 QNAudioSourceMixer.setAllSourcesVolume 接口分别对指定音源和所有音源进行音量配置。
- 本地播放音量:可以通过 QNMicrophoneAudioTrack.setPlayingVolume 接口进行配置,需要注意的是,播放音量是基于混音后的音频进行调整的,会受到混音音量调整的影响。
参考代码如下:
mMicrophoneAudioTrack.setVolume(0.5f); // 设置麦克风采集(混音)音量
mMicrophoneAudioTrack.setPlayingVolume(0.5f); // 设置混音后本地播放的音量
mAudioSourceMixer.setVolume(audioSource.getID(), 0.5f); // 设置指定音效的混音音量
mAudioSourceMixer.setAllSourcesVolume(0.5f); // 设置所有音效的混音音量
返听
若您在混音场景下,有开启返听的需要,则可以通过 QNMicrophoneAudioTrack.setEarMonitorEnabled 接口进行开启,参考代码如下:
mMicrophoneAudioTrack.setEarMonitorEnabled(true); // 开启返听
为达到最佳体验,建议在佩戴耳机的情况下使用该功能
注意事项
- 混音功能会将混音音频与当前已发布的音频 Track 数据混合并推送出去,若当前的音频 Track 尚未发布,则混音操作将失效。
- 混音功能建议在佩戴耳机的情况下使用。需要注意的是 SDK 内部播放器的音量控制采用了 Android 5.0 以上设置播放音量相关的 API,所以存在设置背景音量对部分低版本机型在本地播放时可能会失效,但在远端听到的是设置好的音量的情况,故混音功能推荐在 Android 5.0 以上的机型中使用以获得最好的体验。
示例代码
多音源混音场景的示例代码可参考 QNRTC-API-Examples