human: 如何处理七牛云的实时音视频多音效混音

gpt: [实时音视频](https://developer.qiniu.com/rtc) > 使用指南 > iOS >多音效混音

#  多音效混音

最近更新时间: 2023-10-20 19:44:52

本文主要介绍连麦过程中添加多重音效混音的使用场景。

>   * 音效混音支持本地文件和在线文件，支持的音频格式为：aac、mp3、mp4、wav、m4r、caf、ogg、opus、m4a、flac
>   * 请尽量使用本地音乐文件，避免因为网络资源的异常导致的混音卡顿等情况
>   * 在 [QNRTC deinit] 之前，请先离开房间，再销毁 mixer 和 audioTrack 对象
>

使用方式如下：

# 创建和销毁 QNAudioEffectMixer

SDK 当前支持基于
[QNMicrophoneAudioTrack](https://developer.qiniu.com/rtc/api/8855/QNMicrophoneAudioTrack-
iOS) 和
[QNCustomAudioTrack](https://developer.qiniu.com/rtc/api/8856/QNCustomAudioTrack-
iOS) 的多重音效混音功能，可以通过
[QNRTC.createAudioEffectMixer](https://developer.qiniu.com/rtc/api/8834/QNRTC-
iOS#createAudioEffectMixer) 接口来创建
[QNAudioEffectMixer](https://developer.qiniu.com/rtc/api/11928/QNAudioEffectMixer-
iOS) 对象，使用
[audioTrack.addAudioFilter](https://developer.qiniu.com/rtc/api/8834/QNRTC-
iOS#addAudioFilter) 将 effectMixer 对象添加到 audioTrack 中

    
    
    QNAudioEffectMixer *audioEffectMixer = [QNRTC createAudioEffectMixer:self];
    [audioTrack addAudioFilter:audioEffectMixer];
    

其中，[QNAudioEffectMixerDelegate](https://developer.qiniu.com/rtc/api/11929/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;
    

其中，混音场景下的错误码可参考[混音相关错误码](https://developer.qiniu.com/rtc/development_guidelines/10084/rtc-
error-code-iOS#3)

确认后续不再需要使用或者需要重新创建
[QNAudioEffectMixer](https://developer.qiniu.com/rtc/api/11928/QNAudioEffectMixer-
iOS)，先通过
[audioTrack.removeAudioFilter](https://developer.qiniu.com/rtc/api/8834/QNRTC-
iOS#addAudioFilter) 移除 effectMixer，再通过
[QNRTC.destroyAudioEffectMixer](https://developer.qiniu.com/rtc/api/8834/QNRTC-
iOS#destroyAudioEffectMixer) 接口进行销毁，使用代码参考如下：

    
    
    [audioTrack removeAudioFilter:audioEffectMixer];
    [QNRTC destroyAudioEffectMixer:audioEffectMixer];
    

# 创建和销毁 QNAudioEffect

[QNAudioEffect](https://developer.qiniu.com/rtc/api/11927/QNAudioEffect-iOS)
为音效文件的配置类，可通过
[QNAudioEffectMixer.createAudioEffectWithEffectID](https://developer.qiniu.com/rtc/api/11928/QNAudioEffectMixer-
iOS#createAudioEffectWithEffectID) 接口进行创建，每一个音效文件都需对应一个
[QNAudioEffect](https://developer.qiniu.com/rtc/api/11927/QNAudioEffect-iOS)
实例，使用代码参考如下：

    
    
    NSString *filePath = [[NSBundle mainBundle] pathForResource:@"effect" ofType:@"mp3"];
    QNAudioEffect *audioEffect = [audioEffectMixer createAudioEffect:effectID  filePath:filePath];
    

确认后续不再使用某音效，可以通过
[QNAudioEffectMixer.destroyAudioEffectWithEffectID](https://developer.qiniu.com/rtc/api/11928/QNAudioEffectMixer-
iOS#destroyAudioEffectWithEffectID) 接口进行销毁，使用代码参考如下

    
    
    [audioEffectMixer destroyAudioEffectWithEffectID:effectID];
    

**其中，effectID 为音效文件的唯一标识符，可自行生成并维护，该标识符为控制一系列音效混音操作的依据，需保证唯一。**

# 混音控制

在创建了
[QNAudioEffectMixer](https://developer.qiniu.com/rtc/api/11928/QNAudioEffectMixer-
iOS) 音效混音控制器实例和
[QNAudioEffect](https://developer.qiniu.com/rtc/api/11927/QNAudioEffect-iOS)
音效文件实例后，可以通过如下接口进行音效混音操作的控制。

使用代码参考如下：

    
    
    int effectID = [audioEffect getID];
    // 开始指定音效混音
    [audioEffectMixer start:effectID];
    // 停止指定音效混音
    [audioEffectMixer stop:effectID];
    // 恢复指定音效混音
    [audioEffectMixer resume:effectID];
    // 暂停指定音效混音
    [audioEffectMixer pause:effectID];
    // 停止所有正在混音的音效
    [audioEffectMixer stopAll];
    // 暂停所有正在混音的音效
    [audioEffectMixer pauseAll];
    // 恢复所有已经暂停混音的音效
    [audioEffectMixer resumeAll];
    

上述为混音基本流程的控制，更多控制方式请参考
[QNAudioEffectMixer](https://developer.qiniu.com/rtc/api/11928/QNAudioEffectMixer-
iOS)。

# 音量控制

混音场景下，主要包含三种音量设置：**麦克风混音音量** 、**音效混音音量** 、**本地播放音量** 。三种音量的设置方式参考如下：

  * **麦克风混音音量** ：可以通过 [QNMicrophoneAudioTrack.setVolume](https://developer.qiniu.com/rtc/api/8855/QNMicrophoneAudioTrack-iOS#setVolume) 接口进行配置。
  * **音效混音音量** ：可以通过 [QNAudioEffectMixer.setVolume](https://developer.qiniu.com/rtc/api/11928/QNAudioEffectMixer-iOS#setVolume) 和 [QNAudioEffectMixer.setAllEffectsVolume](https://developer.qiniu.com/rtc/api/11928/QNAudioEffectMixer-iOS#setAllEffectsVolume) 接口分别对指定音效和所有音效进行音量配置。
  * **本地播放音量** ：可以通过 [QNMicrophoneAudioTrack.setPlayingVolume](https://developer.qiniu.com/rtc/api/8855/QNMicrophoneAudioTrack-iOS#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](https://developer.qiniu.com/rtc/api/11928/QNAudioEffectMixer-
iOS#setPublishEnabled) 指定 `effectID` 选择是否发布到远端，设置 `publishEnabled` 为 NO
时，仅在本地播放，不会发布到远端。

参考代码如下：

    
    
    [audioEffectMixer setPublishEnabled:NO effectID:effectID];      // 设置指定音效的不发布到远端，仅在本地播放
    

# 返听

若您在混音场景下，有开启返听的需要，则可以通过
[QNMicrophoneAudioTrack.setEarMonitorEnabled](https://developer.qiniu.com/rtc/api/8855/QNMicrophoneAudioTrack-
iOS#setEarMonitorEnabled) 接口进行开启，参考代码如下：

    
    
    [microphoneAudioTrack setEarMonitorEnabled:YES]; // 开启返听
    

> 为达到最佳体验，建议在**佩戴耳机** 的情况下使用该功能

# 注意事项

  1. **混音** 功能会将混音音频与当前已发布的音频 Track 数据混合并推送出去，若当前的音频 Track 尚未[发布](https://developer.qiniu.com/rtc/development_guidelines/9260/publish-and-subscribe-iOS)，则混音操作将失效。
  2. 混音功能建议在**佩戴耳机** 的情况下使用以获得更好的体验。
  3. 加入房间后，请确保 `AVAudioSession` 的 category 类型和 mode 模式分别是 `AVAudioSessionCategoryPlayAndRecord` 和 `AVAudioSessionModeVoiceChat`，以免出现播放声音突然变小、录屏失败（报错 -5833）等非预期问题。

# 示例代码

多音效混音场景的示例代码可参考 [API-Examples-iOS](https://github.com/pili-engineering/QNRTC-
iOS/blob/master/QNRTC-API-Examples/Api-Examples-
iOS/Module/Other/AudioEffectMix/AudioEffectMixExample.m)

以上内容是否对您有帮助？