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

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

#  多音效混音

最近更新时间: 2022-06-20 15:34:30

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

>   * 音效混音支持本地文件和在线文件，支持的音频格式为：aac、mp3、mp4、ogg、opus、wav、m4a、flac
>   * 请尽量使用本地音乐文件，避免因为网络资源的异常导致的混音卡顿等情况
>

使用方式如下：

# 创建 QNAudioEffectMixer

SDK 当前仅支持基于
[QNMicrophoneAudioTrack](https://developer.qiniu.com/rtc/api/11210/QNMicrophoneAudioTrack-
Linux) 的多重音效混音功能，可以通过
[QNMicrophoneAudioTrack.CreateAudioEffectMixer](https://developer.qiniu.com/rtc/api/11210/QNMicrophoneAudioTrack-
Linux#CreateAudioEffectMixer) 接口来创建
[QNAudioEffectMixer](https://developer.qiniu.com/rtc/api/11987/QNAudioEffectMixer-
Linux) 对象

    
    
    QNAudioEffectMixer* audio_effect_mixer = microphone_audio_track.CreateAudioEffectMixer(listener);
    

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

    
    
    class QINIU_EXPORT_DLL QNAudioEffectMixerListener {
     public:
      /**
       * 错误回调
       *
       * @param error_code    错误码
       * @param error_message 错误信息
       */
      virtual void OnAudioEffectMixerError(int error_code,
                                           const std::string& error_message) = 0;
        
      /**
       * 某音效播放完成的回调
       *
       * @param effect_id 音效 id
       */
      virtual void OnAudioEffectFinished(int effect_id) = 0;
     protected:
      ~QNAudioEffectMixerListener(){};
    };
    

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

# 创建 QNAudioEffect

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

    
    
    string file_path = "../effect.mp3";
    QNAudioEffect* audio_effect = audio_effect_mixer->CreateAudioEffect(effect_id, file_path);
    

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

# 混音控制

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

使用代码参考如下：

    
    
    // 开始指定音效混音
    audio_effect_mixer->Start(audio_effect.GetID());
    // 停止指定音效混音
    audio_effect_mixer->Stop(audio_effect.GetID());
    // 恢复指定音效混音
    audio_effect_mixer->Resume(audio_effect.GetID());
    // 暂停指定音效混音
    audio_effect_mixer->Pause(audio_effect.GetID());
    // 停止所有正在混音的音效
    audio_effect_mixer->StopAll();
    // 暂停所有正在混音的音效
    audio_effect_mixer->PauseAll();
    // 恢复所有已经暂停混音的音效
    audio_effect_mixer->ResumeAll();
    

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

# 音量控制

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

  * **麦克风混音音量** ：可以通过 [QNMicrophoneAudioTrack->SetVolume](https://developer.qiniu.com/rtc/api/11210/QNMicrophoneAudioTrack-Linux#SetVolume) 接口进行配置。
  * **音效混音音量** ：可以通过 [QNAudioEffectMixer.SetVolume](https://developer.qiniu.com/rtc/api/11987/QNAudioEffectMixer-Linux#SetVolume) 和 [QNAudioEffectMixer.SetAllEffectsVolume](https://developer.qiniu.com/rtc/api/11987/QNAudioEffectMixer-Linux#SetAllEffectsVolume) 接口分别对指定音效和所有音效进行音量配置。

参考代码如下：

    
    
    microphone_audio_track.SetVolume(0.5f);                  // 设置麦克风采集(混音)音量
    audio_effect_mixer->SetVolume(audio_effect.GetID(), 0.5f); // 设置指定音效的混音音量
    audio_effect_mixer->SetAllEffectsVolume(0.5f);            // 设置所有音效的混音音量
    

# 注意事项

  1. **混音** 功能会将混音音频与当前已发布的音频 Track 数据混合并推送出去，若当前的音频 Track 尚未发布，则混音操作将失效。

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