-
Notifications
You must be signed in to change notification settings - Fork 209
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
v3.x 和 v4.x 对于背景音乐功能支持存在差异
SDK内部负责创建和销毁背景音乐相关资源,开发者只需要调用KSYStreamer的接口startBgm和stopBgm开启和关闭背景音乐即可。
接口说明
接口 | 说明 |
---|---|
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时,切记注意以下几点:
- 在窗口onResume和onPause的时候不再需要对BgmPlayer的播放做任何处理,因为会支持纯音频推流,切记把这部分代码删除
- onDestroy时也不需要对bgmPlayer的实例进行释放,SDK内部会处理,也需要把这部分代码删除
- 不建议您持有KSYBgmPlayer的实例,想要访问接口使用KSYStreamer.getAudioPlayerCapture().getBgmPlayer()来代替
- 在耳返时,您不再需要对KSYBgmPlayer进行静音处理,SDK内部会进行
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();
-
开启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);
v4.0.0 暂时不支持画中画,v4.1.0 即将支持 v3.x的画中画参考画中画