实时音视频

  • 实时音视频 > 使用指南 > Android >音频裸数据混音

    音频裸数据混音

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

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

    使用方式如下:

    创建 QNAudioSourceMixer

    SDK 支持对不同的音频 Track 设置混音控制器,可以通过 QNRTC.createAudioSourceMixer 来创建 QNAudioSourceMixer 对象,再通过 QNLocalAudioTrack.addAudioFilter 的方式进行混音控制器的关联。

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

    其中,QNAudioSourceMixerListener 为 PCM 混音回调代理,回调方法定义如下:

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

    混音场景下的错误码可参考混音相关错误码

    若需移除音频 Track 上的音源混音控制器,可通过 QNLocalAudioTrack.removeAudioFilter 的方式进行音源混音控制器的移除,使用代码参考如下:

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

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

    创建 QNAudioSource

    QNAudioSource 为音源配置类,支持两种创建方式:

    1. QNAudioSourceMixer.createAudioSource[1/2]:通过非阻塞模式创建 QNAudioSource
    2. QNAudioSourceMixer.createAudioSource[2/2]:通过指定阻塞模式创建 QNAudioSource

    使用代码参考如下:

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

    阻塞模式的配置决定了 SDK 是否会阻塞数据导入的线程:

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

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

    数据导入

    在创建 QNAudioSource 之后,便可以通过 QNAudioSourceMixer.pushAudioFrame 接口基于 sourceID 进行 PCM 混音数据的导入。

    参考代码如下:

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

    其中,frame 为 QNAudioFrame 的对象实例,可以在构造对象实例时指定 pcm 数据的 buffer采样率位宽声道数等信息。

    推送控制

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

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

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

    音量控制

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

    参考代码如下:

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

    返听

    若您在混音场景下,有开启返听的需要,则可以通过 QNMicrophoneAudioTrack.setEarMonitorEnabled 接口进行开启,参考代码如下:

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

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

    注意事项

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

    示例代码

    多音源混音场景的示例代码可参考 QNRTC-API-Examples

    以上内容是否对您有帮助?
  • Qvm free helper
    Close