多音效混音
本文主要介绍连麦过程中添加多重音效混音的使用场景。
- 音效混音支持本地文件和在线文件,支持的音频格式为:aac、mp3、mp4、wav、m4r、caf、ogg、opus、m4a、flac
- 请尽量使用本地音乐文件,避免因为网络资源的异常导致的混音卡顿等情况
- 在 [QNRTC deinit] 之前,请先离开房间,再销毁 mixer 和 audioTrack 对象
使用方式如下:
创建和销毁 QNAudioEffectMixer
SDK 当前支持基于 QNMicrophoneAudioTrack 和 QNCustomAudioTrack 的多重音效混音功能,可以通过 QNRTC.createAudioEffectMixer 接口来创建 QNAudioEffectMixer 对象,使用 audioTrack.addAudioFilter 将 effectMixer 对象添加到 audioTrack 中
QNAudioEffectMixer *audioEffectMixer = [QNRTC createAudioEffectMixer:self];
[audioTrack addAudioFilter:audioEffectMixer];
其中,QNAudioEffectMixerDelegate 为音效混音代理回调,回调方法定义如下:
/*!
* @abstract 音效混音发生错误的回调
*
* @param audioEffectMixer 音效混音实例
*
* @param error 错误
*
* @since v5.1.0
*/
- (void)audioEffectMixer:(QNAudioEffectMixer *)audioEffectMixer didFailWithError:(NSError *)error;
/*!
* @abstract 音效混音某音效播放完成的回调
*
* @param audioEffectMixer 音效混音实例
*
* @param effectID 音效 ID
*
* @since v5.1.0
*/
- (void)audioEffectMixer:(QNAudioEffectMixer *)audioEffectMixer didFinished:(int)effectID;
其中,混音场景下的错误码可参考混音相关错误码
确认后续不再需要使用或者需要重新创建 QNAudioEffectMixer,先通过 audioTrack.removeAudioFilter 移除 effectMixer,再通过 QNRTC.destroyAudioEffectMixer 接口进行销毁,使用代码参考如下:
[audioTrack removeAudioFilter:audioEffectMixer];
[QNRTC destroyAudioEffectMixer:audioEffectMixer];
创建和销毁 QNAudioEffect
QNAudioEffect 为音效文件的配置类,可通过 QNAudioEffectMixer.createAudioEffectWithEffectID 接口进行创建,每一个音效文件都需对应一个 QNAudioEffect 实例,使用代码参考如下:
NSString *filePath = [[NSBundle mainBundle] pathForResource:@"effect" ofType:@"mp3"];
QNAudioEffect *audioEffect = [audioEffectMixer createAudioEffect:effectID filePath:filePath];
确认后续不再使用某音效,可以通过 QNAudioEffectMixer.destroyAudioEffectWithEffectID 接口进行销毁,使用代码参考如下
[audioEffectMixer destroyAudioEffectWithEffectID:effectID];
其中,effectID 为音效文件的唯一标识符,可自行生成并维护,该标识符为控制一系列音效混音操作的依据,需保证唯一。
混音控制
在创建了 QNAudioEffectMixer 音效混音控制器实例和 QNAudioEffect 音效文件实例后,可以通过如下接口进行音效混音操作的控制。
使用代码参考如下:
int effectID = [audioEffect getID];
// 开始指定音效混音
[audioEffectMixer start:effectID];
// 停止指定音效混音
[audioEffectMixer stop:effectID];
// 恢复指定音效混音
[audioEffectMixer resume:effectID];
// 暂停指定音效混音
[audioEffectMixer pause:effectID];
// 停止所有正在混音的音效
[audioEffectMixer stopAll];
// 暂停所有正在混音的音效
[audioEffectMixer pauseAll];
// 恢复所有已经暂停混音的音效
[audioEffectMixer resumeAll];
上述为混音基本流程的控制,更多控制方式请参考 QNAudioEffectMixer。
音量控制
混音场景下,主要包含三种音量设置:麦克风混音音量、音效混音音量、本地播放音量。三种音量的设置方式参考如下:
- 麦克风混音音量:可以通过 QNMicrophoneAudioTrack.setVolume 接口进行配置。
- 音效混音音量:可以通过 QNAudioEffectMixer.setVolume 和 QNAudioEffectMixer.setAllEffectsVolume 接口分别对指定音效和所有音效进行音量配置。
- 本地播放音量:可以通过 QNMicrophoneAudioTrack.setPlayingVolume 接口进行配置,需要注意的是,播放音量是基于混音后的音频进行调整的,会受到混音音量调整的影响。
参考代码如下:
[microphoneAudioTrack setVolume:0.5]; // 设置麦克风采集(混音)音量
[microphoneAudioTrack setPlayingVolume:0.5]; // 设置混音后本地播放的音量
int effectID = [audioEffect getID];
[audioEffectMixer setVolume:0.5 effectID:effectID]; // 设置指定音效的混音音量
[audioEffectMixer setAllEffectsVolume:0.5]; // 设置所有音效的混音音量
发布
混音场景下,默认音效全部发布到远端,即 publishEnabled
均为 YES。可使用 QNAudioEffectMixer.setPublishEnabled 指定 effectID
选择是否发布到远端,设置 publishEnabled
为 NO 时,仅在本地播放,不会发布到远端。
参考代码如下:
[audioEffectMixer setPublishEnabled:NO effectID:effectID]; // 设置指定音效的不发布到远端,仅在本地播放
返听
若您在混音场景下,有开启返听的需要,则可以通过 QNMicrophoneAudioTrack.setEarMonitorEnabled 接口进行开启,参考代码如下:
[microphoneAudioTrack setEarMonitorEnabled:YES]; // 开启返听
为达到最佳体验,建议在佩戴耳机的情况下使用该功能
注意事项
- 混音功能会将混音音频与当前已发布的音频 Track 数据混合并推送出去,若当前的音频 Track 尚未发布,则混音操作将失效。
- 混音功能建议在佩戴耳机的情况下使用以获得更好的体验。
- 加入房间后,请确保
AVAudioSession
的 category 类型和 mode 模式分别是AVAudioSessionCategoryPlayAndRecord
和AVAudioSessionModeVoiceChat
,以免出现播放声音突然变小、录屏失败(报错 -5833)等非预期问题。
示例代码
多音效混音场景的示例代码可参考 API-Examples-iOS