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

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

#  多音效混音

最近更新时间: 2023-10-25 14:59:34

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

>   * 从 v5.2.6
> 版本开始，[QNAudioEffectMixer](https://developer.qiniu.com/rtc/api/11923/QNAudioEffectMixer)
> 需要通过
> [QNRTC.createAudioEffectMixer](https://developer.qiniu.com/rtc/api/8732/QNRTC#createAudioEffectMixer)
> 接口创建，并通过
> [QNLocalAudioTrack.addAudioFilter](https://developer.qiniu.com/rtc/api/8660/QNLocalAudioTrack#addAudioFilter)
> 的方式进行关联。将不再支持通过 **QNMicrophoneAudioTrack.createAudioEffectMixer** 创建
>   * 音效混音支持本地文件和在线文件，支持的音频格式为：aac、mp3、mp4、ogg、opus、wav、m4a、flac
>   * 请尽量使用本地音乐文件，避免因为网络资源的异常导致的混音卡顿等情况
>

使用方式如下：

# 创建 QNAudioEffectMixer

SDK 支持对不同的音频 Track 设置音效混音控制器，可以通过
[QNRTC.createAudioEffectMixer](https://developer.qiniu.com/rtc/api/8732/QNRTC#createAudioEffectMixer)
接口来创建
[QNAudioEffectMixer](https://developer.qiniu.com/rtc/api/11923/QNAudioEffectMixer)
对象。再通过
[QNLocalAudioTrack.addAudioFilter](https://developer.qiniu.com/rtc/api/8660/QNLocalAudioTrack#addAudioFilter)
的方式进行混音控制器的关联。

    
    
    QNAudioEffectMixer audioEffectMixer = mMicrophoneAudioTrack.createAudioEffectMixer(mAudioEffectMixerListener);  // 创建音效混音控制器
    localAudioTrack.addAudioFilter(audioEffectMixer);  // 关联音效混音控制器
    

其中，[QNAudioEffectMixerListener](https://developer.qiniu.com/rtc/api/11924/QNAudioEffectMixerListener)
为音效混音监听器，监听回调定义如下：

    
    
    public interface QNAudioMusicMixerListener {
        /**
         * 音效混音完成时回调
         *
         * @param effectID 已完成混音的音效 ID
         */
        void onEffectFinished(int effectID);
    
        /**
         * 指定音效混音出错时回调
         *
         * @param effectID     音效 ID
         * @param errCode      错误码
         * @param errorMessage 错误信息
         */
        void onEffectError(int effectID, int errCode, String errorMessage);
    
        /**
         * 音效混音发生错误时回调
         * 已废弃，请使用 onEffectError
         *
         * @param errorCode    错误码
         * @param errorMessage 错误信息
         */
        @Deprecated
        void onError(int errorCode, String errorMessage);
    }
    

混音场景下的错误码可参考[混音相关错误码](https://developer.qiniu.com/rtc/development_guidelines/9904/rtc-
error-code-android#4)

**注意：同一个音效混音控制器只能关联一个音频 Track，重复添加将会失败。**

# 创建 QNAudioEffect

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

    
    
    String filePath = "/sdcard/effect.mp3";
    QNAudioEffect audioEffect = mAudioEffectMixer.createAudioEffect(effectID, filePath);
    

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

# 混音控制

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

使用代码参考如下：

    
    
    // 开始指定音效混音
    mAudioEffectMixer.start(audioEffect.getID());
    // 停止指定音效混音
    mAudioEffectMixer.stop(audioEffect.getID());
    // 恢复指定音效混音
    mAudioEffectMixer.resume(audioEffect.getID());
    // 暂停指定音效混音
    mAudioEffectMixer.pause(audioEffect.getID());
    // 停止所有正在混音的音效
    mAudioEffectMixer.stopAll();
    // 暂停所有正在混音的音效
    mAudioEffectMixer.pauseAll();
    // 恢复所有已经暂停混音的音效
    mAudioEffectMixer.resumeAll();
    

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

# 推送控制

SDK 混音功能默认会将混音音效推送至远端。

从 v5.2.0 版本开始，SDK 支持配置混音音效是否需要推送至远端，若关闭推送，则混音音效将只做本地播放，配置接口如下：

    
    
    mAudioEffectMixer.setPublishEnabled(audioEffect.getID(), false);
    

**注：**若您的业务场景涉及到本地音效的播放，如礼物音效等，那么为了避免系统的降噪对通话质量产生影响，我们建议您**
通过音效混音接口替代其他音频播放器来实现本地音效的播放**。

# 音量控制

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

  * **麦克风混音音量** ：可以通过 [QNMicrophoneAudioTrack.setVolume](https://developer.qiniu.com/rtc/api/8667/QNMicrophoneAudioTrack#setVolume) 接口进行配置。
  * **音效混音音量** ：可以通过 [QNAudioEffectMixer.setVolume](https://developer.qiniu.com/rtc/api/11923/QNAudioEffectMixer#setVolume) 和 [QNAudioEffectMixer.setAllEffectsVolume](https://developer.qiniu.com/rtc/api/11923/QNAudioEffectMixer#setAllEffectsVolume) 接口分别对指定音效和所有音效进行音量配置。
  * **本地播放音量** ：可以通过 [QNMicrophoneAudioTrack.setPlayingVolume](https://developer.qiniu.com/rtc/api/8667/QNMicrophoneAudioTrack#setPlayingVolume) 接口进行配置，需要注意的是，播放音量是基于混音后的音频进行调整的，会受到混音音量调整的影响。

参考代码如下：

    
    
    mMicrophoneAudioTrack.setVolume(0.5f);                  // 设置麦克风采集(混音)音量
    mMicrophoneAudioTrack.setPlayingVolume(0.5f);           // 设置混音后本地播放的音量
    mAudioEffectMixer.setVolume(audioEffect.getID(), 0.5f); // 设置指定音效的混音音量
    mAudioEffectMixer.setAllEffectsVolume(0.5f);            // 设置所有音效的混音音量
    

# 返听

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

    
    
    mMicrophoneAudioTrack.setEarMonitorEnabled(true); // 开启返听
    

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

# 注意事项

  1. **混音** 功能会将混音音频与当前已发布的音频 Track 数据混合并推送出去，若当前的音频 Track 尚未[发布](https://developer.qiniu.com/rtc/development_guidelines/8769/publish-and-subscribe-android)，则混音操作将失效。
  2. 混音功能建议在**佩戴耳机** 的情况下使用。需要注意的是 SDK 内部播放器的音量控制采用了 Android 5.0 以上设置播放音量相关的 API，所以存在设置背景音量对部分低版本机型在本地播放时可能会失效，但在远端听到的是设置好的音量的情况，故混音功能推荐在 Android 5.0 以上的机型中使用以获得最好的体验。

# 示例代码

背景音乐混音场景的完整示例代码可参考 [QNRTC-API-Examples](https://github.com/pili-
engineering/QNRTC-Android/blob/master/QNRTC-API-
Examples/app/src/main/java/com/qiniu/droid/rtc/api/examples/activity/AudioEffectsMixingActivity.java)。

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