human: 如何处理七牛云的实时音视频背景音乐混音

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

#  背景音乐混音

最近更新时间: 2022-06-20 15:19:48

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

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

使用方式如下：

# 创建 QNAudioMusicMixer

SDK 当前仅支持基于
[QNMicrophoneAudioTrack](https://developer.qiniu.com/rtc/api/11210/QNMicrophoneAudioTrack-
Linux) 的混音功能，可以通过
[QNMicrophoneAudioTrack.CreateAudioMusicMixer](https://developer.qiniu.com/rtc/api/11210/QNMicrophoneAudioTrack-
Linux#CreateAudioMusicMixer) 来创建
[QNAudioMusicMixer](https://developer.qiniu.com/rtc/api/11989/QNAudioMusicMixer-
Linux) 对象

    
    
    std::string file_path = "../example.mp3";
    QNAudioMusicMixer* audio_mixer = microphone_audio_track->CreateAudioMusicMixer(file_path, listener);
    

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

    
    
    class QINIU_EXPORT_DLL QNAudioMusicMixerListener {
     public:
      /**
       * 错误回调
       * 
       * @param error_code 错误码
       * @param error_message 错误信息
       */
      virtual void OnAudioMusicMixerError(int error_code,
                                          const std::string& error_message) = 0;
      /**
       * 背景音乐混音状态变化回调
       *
       * @param music_state_ 背景音乐混音状态
       */
      virtual void OnAudioMusicMixerStateChanged(QNMusicMixerState music_state) = 0;
    
      /**
       * 背景音乐播放进度回调
       *
       * @param current_pos 背景音乐播放当前进度
       */
      virtual void OnAudioMusicMixing(int64_t current_pos) = 0;
    
     protected:
      ~QNAudioMusicMixerListener(){};
    };
    

其中，混音状态的改变都会通过
[QNAudioMusicMixerListener.OnAudioMusicMixerStateChanged](https://developer.qiniu.com/rtc/api/11990/QNAudioMusicMixerListener-
Linux#onStateChanged) 回调通知到上层。回调的监听状态可参考
[QNMusicMixerState](https://developer.qiniu.com/rtc/api/11991/QNMusicMixerState-
Linux)。混音场景下的错误码可参考[混音相关错误码](https://developer.qiniu.com/rtc/development_guidelines/11369/error-
code-linux)

# 混音控制

在创建了
[QNAudioMusicMixer](https://developer.qiniu.com/rtc/api/11989/QNAudioMusicMixer-
Linux) 实例后，可以通过该实例提供的混音控制接口进行混音操作的控制，使用代码参考如下：

    
    
    // 开始混音，成功后会触发 QNMusicMixerState.kStateMixing 状态的回调
    mAudioMixer->Start();
    // 停止混音，成功后会触发 QNMusicMixerState.kStateStopped 状态的回调
    mAudioMixer->Stop();
    // 恢复混音，成功后会触发 QNMusicMixerState.kStateMixing 状态的回调
    mAudioMixer->Resume();
    // 暂停混音，成功后会触发 QNMusicMixerState.kStatePaused 状态的回调
    mAudioMixer->Pause();
    // 跳到指定位置进行混音，成功后回触发 QNMusicMixerState.kStateMixing 状态的回调
    mAudioMixer->SeekTo(position_ms);
    

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

# 音量控制

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

  * **麦克风混音音量** ：可以通过 [QNMicrophoneAudioTrack.SetVolume](https://developer.qiniu.com/rtc/api/11210/QNMicrophoneAudioTrack-Linux#SetVolume) 接口进行配置。
  * **背景音乐混音音量** ：可以通过 [QNAudioMusicMixer.SetMixingVolume](https://developer.qiniu.com/rtc/api/11989/QNAudioMusicMixer-Linux#SetMixingVolume) 接口进行配置。

参考代码如下：

    
    
    microphone_audio_track->SetVolume(0.5f);          // 设置麦克风采集(混音)音量
    audio_music_mixer->SetMixingVolume(0.5f);         // 设置背景音乐的混音音量
    

# 切换音乐

背景音乐混音**仅支持同时混合一路背景音乐** ，若需要切换背景音乐，可通过重新调用
[QNMicrophoneAudioTrack.CreateAudioMusicMixer](https://developer.qiniu.com/rtc/api/11210/QNMicrophoneAudioTrack-
Linux#CreateAudioMusicMixer) 创建
[QNAudioMusicMixer](https://developer.qiniu.com/rtc/api/11989/QNAudioMusicMixer-
Linux) 实例实现。参考代码如下：

    
    
    // 使用 music-1 进行混音
    QNAudioMusicMixer* audio_music_mixer = microphone_audio_track->CreateAudioMusicMixer(music1_file_path, listener); // 创建基于 music-1 的混音控制器
    audio_music_mixer->Start();  // 开始 music-1 的混音
    audio_music_mixer->Stop();   // 停止 music-1 的混音
    microphone_audio_track->DestroyAudioMusicMixer(audio_music_mixer);  // 销毁第一个 mixer
    // 切换音乐到 music-2 进行混音
    audio_music_mixer = microphone_audio_track->CreateAudioMusicMixer(music2_file_path, listener); // 创建基于 music-2 的混音控制器
    audio_music_mixer->Start();  // 开始 music-2 的混音
    audio_music_mixer->Stop();   // 停止 music-2 的混音
    

# 注意事项

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

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