Skip to content

Audio_Mixer

zanxiaofei edited this page Dec 23, 2016 · 9 revisions

关于混音功能,主要是针对主播端插上耳机后,背景音乐等无法通过麦克风返采, 进而播放端无法听到的问题。

SDK提供混音功能,当前提供以下几种声原混合:

  • Mic录制声音
  • 播放中的背景音乐
  • 画中画声音(当前仅v3.x,v4.0.0暂时不支持,v4.1.0会支持)

开发者只需要开启背景音乐,画中画,SDK内部会完成混音
混音效果可在推流过程中动态生效
混音在开启耳返时在主播端生效
混音在播放端总是生效

注:
v3.x代表版本号为3.x.x的推流SDK
v4.x代表版本号为4.x.x的推流SDK

1. 背景音乐

v3.x 和 v4.x 对于背景音乐功能支持存在差异

1.1 v4.x 背景音乐设置说明

SDK内部负责创建和销毁背景音乐相关资源,开发者只需要调用KSYStreamer的接口startBgmstopBgm开启和关闭背景音乐即可。

接口说明

接口 说明
KSYStreamer.getAudioPlayerCapture().getBgmPlayer() 获取背景音乐实例KSYBgmPlayer
KSYStreamer.getAudioPlayerCapture().getBgmPlayer()

.setOnCompletionListener
设置音频播放结束状态回调
KSYStreamer.getAudioPlayerCapture().getBgmPlayer()

.setOnErrorListener
设置音频播放错误回调
KSYStreamer.getAudioPlayerCapture().getBgmPlayer()


.setVolume
设置背景音乐音量
KSYStreamer.getAudioPlayerCapture().getBgmPlayer()


.pause
暂停背景音乐播放
KSYStreamer.getAudioPlayerCapture().getBgmPlayer()


.resume
暂停后恢复背景音乐播放
KSYStreamer.getAudioPlayerCapture().getBgmPlayer()


.setMute
设置背景音乐静音
KSYStreamer.startBgm(String path, boolean loop) 开始背景音乐播放,path是背景音乐文件绝对路径,loop代表是否循环播放
KSYStreamer.stopBgm() 停止背景音乐播放

参考代码:

 private void onBgmChecked(boolean isChecked) {
        if (isChecked) {
            mStreamer.getAudioPlayerCapture().getBgmPlayer()
                    .setOnCompletionListener(new KSYBgmPlayer.OnCompletionListener() {
                        @Override
                        public void onCompletion(KSYBgmPlayer bgmPlayer) {
                            Log.d(TAG, "End of the currently playing music");
                        }
                    });
            mStreamer.getAudioPlayerCapture().getBgmPlayer()
                    .setOnErrorListener(new KSYBgmPlayer.OnErrorListener() {
                        @Override
                        public void onError(KSYBgmPlayer bgmPlayer, int what, int extra) {
                            Log.e(TAG, "onBgmError: " + what);
                        }
                    });
            mStreamer.getAudioPlayerCapture().getBgmPlayer().setVolume(1.0f);
            mStreamer.getAudioPlayerCapture().getBgmPlayer().setMute(false);
            mStreamer.startBgm(mBgmPath, true);
            mStreamer.setHeadsetPlugged(true);
        } else {
            mStreamer.stopBgm();
        }
    }

注:如果您是v3.x的用户,在迁移到v4.x时,切记注意以下几点:

  1. 在窗口onResume和onPause的时候不再需要对BgmPlayer的播放做任何处理,因为会支持纯音频推流,切记把这部分代码删除
  2. onDestroy时也不需要对bgmPlayer的实例进行释放,SDK内部会处理,也需要把这部分代码删除
  3. 不建议您持有KSYBgmPlayer的实例,想要访问接口使用KSYStreamer.getAudioPlayerCapture().getBgmPlayer()来代替
  4. 在耳返时,您不再需要对KSYBgmPlayer进行静音处理,SDK内部会进行

1.2 v3.x 背景音乐设置说明

v3.x 中com.ksy.recordlib.service.util.audio.KSYBgmPlayer类实现了背景音乐的播放功能, 结合KSYStreamer可以实现背景音乐的播放控制:

  • 创建Bgm播放器:

    mKsyBgmPlayer = KSYBgmPlayer.getInstance();
  • 创建播放器回调,监听播放错误及播放完成事件

    private KSYBgmPlayer.OnBgmPlayerListener mBgmListener = new KSYBgmPlayer.OnBgmPlayerListener() {
        @Override
        public void onCompleted() {
            Log.d(TAG, "End of the currently playing music");
        }
    
        @Override
        public void onError(int err) {
            Log.e(TAG, "onMusicError: " + err);
        }
    };
    • onCompleted回调仅在开启bgm播放时loop参数设为false的情况下会被触发
    • onError回调中的错误号包含:
      • KSYBgmPlayer.BGM_ERROR_NONE
      • KSYBgmPlayer.BGM_ERROR_UNKNOWN
      • KSYBgmPlayer.BGM_ERROR_NOT_SUPPORTED
      • KSYBgmPlayer.BGM_ERROR_IO
      • KSYBgmPlayer.BGM_ERROR_MALFORMED
  • 播放控制

    /**
     * 设置播放音量,该音量同时影响推流端的播放音量以及混音音量
     * volume: 为0-1范围内的float值
     */
    public void setVolume(float volume);
    // 设置静音状态,为true时仅推流端播放静音,混音不受影响
    public void setMute(boolean mute);
    // 获取当前播放进度,单位为毫秒
    public long getPosition();
    // 获取当前歌曲的总时长,单位为毫秒
    public long getDuration();
    // 暂停播放
    public void pause();
    // 恢复播放
    public void resume();

结合KSYStreamer实现BGM的播放

  • 开启BGM播放及混音:

    // 设置BGM播放器
    mStreamer.setBgmPlayer(KSYBgmPlayer player);
    /**
     * 开始BGM的播放及混音
     * path: 本地音乐文件路径,支持mp3, aac等
     * loop: 是否单曲循环
     */
    mStreamer.startMixMusic(String path, boolean loop);
    // isPlugged为true时内部进行软件混音,为false不会对背景音乐进行混音
    mStreamer.setHeadsetPlugged(boolean isPlugged);
  • 停止BGM播放及混音

    mStreamer.stopMixMusic();

调用示例:

mKsyBgmPlayer = KSYBgmPlayer.getInstance();
mKsyBgmPlayer.setOnBgmPlayerListener(mBgmListener);
mKsyBgmPlayer.setVolume(bgmVolume);
mStreamer.setBgmPlayer(mKsyBgmPlayer);
mStreamer.startMixMusic("/sdcard/test.mp3", true);
mStreamer.setHeadsetPlugged(true);

2. 画中画

v4.0.0 暂时不支持画中画,v4.1.0 即将支持 v3.x的画中画参考画中画

Clone this wiki locally