human: 如何处理七牛云的实时音视频音频裸数据混音

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

#  音频裸数据混音

最近更新时间: 2023-10-25 15:02:07

本文主要介绍连麦过程中添加 PCM 音频裸数据混音的使用场景。

>   * 从 v5.2.6
> 版本开始，[QNAudioSourceMixer](https://developer.qiniu.com/rtc/api/12212/QNAudioSourceMixer)
> 需要通过
> [QNRTC.createAudioSourceMixer](https://developer.qiniu.com/rtc/api/8732/QNRTC#createAudioSourceMixer)
> 接口创建，并通过
> [QNLocalAudioTrack.addAudioFilter](https://developer.qiniu.com/rtc/api/8660/QNLocalAudioTrack#addAudioFilter)
> 的方式进行关联。将不再支持通过 **QNMicrophoneAudioTrack.createAudioSourceMixer** 创建
>   * v5.2.0 版本开始支持使用
> [QNAudioSourceMixer](https://developer.qiniu.com/rtc/api/12212/QNAudioSourceMixer)
> 进行 PCM 裸数据的混音操作
>

使用方式如下：

# 创建 QNAudioSourceMixer

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

    
    
    QNAudioSourceMixer audioSourceMixer = QNRTC.createAudioSourceMixer(mAudioSourceMixerListener);  // 创建音源混音控制器
    localAudioTrack.addAudioFilter(audioSourceMixer);  // 关联音源混音控制器
    

其中，[QNAudioSourceMixerListener](https://developer.qiniu.com/rtc/api/12211/QNAudioSourceMixerListener)
为 PCM 混音回调代理，回调方法定义如下：

    
    
    public interface QNAudioSourceMixerListener {
        /**
         * 音源混音发生错误时回调
         *
         * @param errorCode 错误码
         * @param errorMessage 错误信息
         */
        void onError(int errorCode, String errorMessage);
    }
    

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

若需移除音频 Track 上的音源混音控制器，可通过
[QNLocalAudioTrack.removeAudioFilter](https://developer.qiniu.com/rtc/api/8660/QNLocalAudioTrack#removeAudioFilter)
的方式进行音源混音控制器的移除，使用代码参考如下：

    
    
    localAudioTrack.removeAudioFilter(audioSourceMixer);  // 移除音源混音控制器
    

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

# 创建 QNAudioSource

[QNAudioSource](https://developer.qiniu.com/rtc/api/12210/QNAudioSource)
为音源配置类，支持两种创建方式：

  1. [QNAudioSourceMixer.createAudioSource[1/2]](https://developer.qiniu.com/rtc/api/12212/QNAudioSourceMixer#createAudioSource%5B1/2%5D)：通过非阻塞模式创建 `QNAudioSource`
  2. [QNAudioSourceMixer.createAudioSource[2/2]](https://developer.qiniu.com/rtc/api/12212/QNAudioSourceMixer#createAudioSource%5B2/2%5D)：通过指定阻塞模式创建 `QNAudioSource`

使用代码参考如下：

    
    
    // 非阻塞模式
    QNAudioSource audioSource = mAudioSourceMixer.createAudioSource(sourceID);
    
    // 阻塞模式
    QNAudioSource audioSource = mAudioSourceMixer.createAudioSource(sourceID, true);
    

> 阻塞模式的配置决定了 SDK 是否会阻塞数据导入的线程：
>
>   * 非阻塞模式下，外部数据需要按照每次送入音频数据的时长间隔依次送入，或者直接使用播放器解码后的回调数据来送入，但不宜送入过快，以免丢弃过多的数据。
>   * 阻塞模式下，外部数据需要持续送入 SDK，但不宜送入太多，以免阻塞导入线程的时间过长。
>

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

# 数据导入

在创建 [QNAudioSource](https://developer.qiniu.com/rtc/api/12210/QNAudioSource)
之后，便可以通过
[QNAudioSourceMixer.pushAudioFrame](https://developer.qiniu.com/rtc/api/12212/QNAudioSourceMixer#pushAudioFrame)
接口基于 sourceID 进行 PCM 混音数据的导入。

参考代码如下：

    
    
    mAudioSourceMixer.pushAudioFrame(sourceID, frame);  // 导入待混音的 pcm 数据
    

其中，frame 为
[QNAudioFrame](https://developer.qiniu.com/rtc/api/8629/QNAudioFrame)
的对象实例，可以在构造对象实例时指定 pcm 数据的 **buffer** 、**采样率** 、**位宽** 和**声道数** 等信息。

# 推送控制

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

SDK 支持配置音源混音是否需要推送至远端，若关闭推送，则音源混音将只做本地播放，配置接口如下：

    
    
    mAudioSourceMixer.setPublishEnabled(audioSource.getID(), false);  // 设置指定音源的不发布到远端，仅在本地播放
    

# 音量控制

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

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

参考代码如下：

    
    
    mMicrophoneAudioTrack.setVolume(0.5f);                  // 设置麦克风采集(混音)音量
    mMicrophoneAudioTrack.setPlayingVolume(0.5f);           // 设置混音后本地播放的音量
    mAudioSourceMixer.setVolume(audioSource.getID(), 0.5f); // 设置指定音效的混音音量
    mAudioSourceMixer.setAllSourcesVolume(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/AudioSourcesMixingActivity.java)

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