语音SDK新增ZEGO
(cherry picked from commit ff50cd4239df1327283337c2036d9ec90caafaa0)
This commit is contained in:
BIN
core/libs/armeabi-v7a/libzegoliveroom.so
Normal file
BIN
core/libs/armeabi-v7a/libzegoliveroom.so
Normal file
Binary file not shown.
BIN
core/libs/zegoaudioroom.jar
Normal file
BIN
core/libs/zegoaudioroom.jar
Normal file
Binary file not shown.
@@ -288,4 +288,12 @@ public class XChatConstants {
|
|||||||
// public static final String QUICK_PASS_BUSINESS_ID = BuildConfig.DEBUG ? "cadbb4ed892549dab4d1adc9d62013bb" : "ba4a642810294561b9cd17034a448b49";
|
// public static final String QUICK_PASS_BUSINESS_ID = BuildConfig.DEBUG ? "cadbb4ed892549dab4d1adc9d62013bb" : "ba4a642810294561b9cd17034a448b49";
|
||||||
|
|
||||||
public static final String APP_MARK = "yinyou";
|
public static final String APP_MARK = "yinyou";
|
||||||
|
|
||||||
|
public static long ZEGO_APP_ID = 3908889013L;
|
||||||
|
public static byte[] ZEGO_APP_SIGN = new byte[]{
|
||||||
|
(byte) 0x28, (byte) 0x0f, (byte) 0x39, (byte) 0x21, (byte) 0x2f, (byte) 0x75, (byte) 0x50, (byte) 0x6a,
|
||||||
|
(byte) 0xf4, (byte) 0x72, (byte) 0x7c, (byte) 0x3a, (byte) 0xc7, (byte) 0x49, (byte) 0xcb, (byte) 0x64,
|
||||||
|
(byte) 0xcc, (byte) 0x43, (byte) 0xee, (byte) 0x89, (byte) 0x05, (byte) 0x4e, (byte) 0x65, (byte) 0x5d,
|
||||||
|
(byte) 0x6b, (byte) 0x28, (byte) 0xee, (byte) 0xb8, (byte) 0x73, (byte) 0xf1, (byte) 0x69, (byte) 0x85
|
||||||
|
};
|
||||||
}
|
}
|
||||||
|
@@ -1,17 +1,16 @@
|
|||||||
package com.yizhuan.xchat_android_core.manager;
|
package com.yizhuan.xchat_android_core.manager;
|
||||||
|
|
||||||
import androidx.annotation.Nullable;
|
|
||||||
|
|
||||||
import com.netease.nim.uikit.common.util.log.LogUtil;
|
import com.netease.nim.uikit.common.util.log.LogUtil;
|
||||||
import com.yizhuan.xchat_android_core.manager.agora.RtcEngineManager;
|
import com.yizhuan.xchat_android_core.manager.agora.RtcEngineManager;
|
||||||
import com.yizhuan.xchat_android_core.manager.wj.WJAudioConstant;
|
import com.yizhuan.xchat_android_core.manager.wj.WJAudioConstant;
|
||||||
import com.yizhuan.xchat_android_core.manager.wj.WJAudioEngineManager;
|
import com.yizhuan.xchat_android_core.manager.wj.WJAudioEngineManager;
|
||||||
|
import com.yizhuan.xchat_android_core.manager.zego.ZegoEngineManager;
|
||||||
import com.yizhuan.xchat_android_core.room.bean.RoomAudioSdkType;
|
import com.yizhuan.xchat_android_core.room.bean.RoomAudioSdkType;
|
||||||
import com.yizhuan.xchat_android_core.room.bean.RoomInfo;
|
import com.yizhuan.xchat_android_core.room.bean.RoomInfo;
|
||||||
import com.yizhuan.xchat_android_core.user.UserModel;
|
import com.yizhuan.xchat_android_core.user.UserModel;
|
||||||
import com.yizhuan.xchat_android_core.utils.LogUtils;
|
import com.yizhuan.xchat_android_core.utils.LogUtils;
|
||||||
|
|
||||||
import io.agora.ktvkit.KTVKit;
|
|
||||||
import io.agora.rtc.Constants;
|
import io.agora.rtc.Constants;
|
||||||
import io.agora.rtc.video.VideoCanvas;
|
import io.agora.rtc.video.VideoCanvas;
|
||||||
|
|
||||||
@@ -40,6 +39,9 @@ public class AudioEngineManager {
|
|||||||
}
|
}
|
||||||
this.iAudioEngine = WJAudioEngineManager.get();
|
this.iAudioEngine = WJAudioEngineManager.get();
|
||||||
break;
|
break;
|
||||||
|
case TYPE_ZEGO:
|
||||||
|
this.iAudioEngine = ZegoEngineManager.get();
|
||||||
|
break;
|
||||||
case TYPE_AGORA:
|
case TYPE_AGORA:
|
||||||
default:
|
default:
|
||||||
this.iAudioEngine = RtcEngineManager.get();
|
this.iAudioEngine = RtcEngineManager.get();
|
||||||
@@ -52,18 +54,23 @@ public class AudioEngineManager {
|
|||||||
RoomInfo curRoomInfo = AvRoomDataManager.get().mCurrentRoomInfo;
|
RoomInfo curRoomInfo = AvRoomDataManager.get().mCurrentRoomInfo;
|
||||||
if (curRoomInfo == null) return;
|
if (curRoomInfo == null) return;
|
||||||
if (iAudioEngine != null) iAudioEngine.leaveChannel();
|
if (iAudioEngine != null) iAudioEngine.leaveChannel();
|
||||||
if (RoomAudioSdkType.WUJIE.equals(audioSdkType)) {
|
|
||||||
AudioEngineManager.get().initRtcEngine(EngineType.TYPE_WJ);
|
if (audioSdkType == null) audioSdkType = RoomAudioSdkType.SHENGWANG;
|
||||||
} else {
|
|
||||||
AudioEngineManager.get().initRtcEngine(EngineType.TYPE_AGORA);
|
switch (audioSdkType) {
|
||||||
|
case RoomAudioSdkType.WUJIE:
|
||||||
|
initRtcEngine(EngineType.TYPE_WJ);
|
||||||
|
break;
|
||||||
|
case RoomAudioSdkType.ZEGO:
|
||||||
|
initRtcEngine(EngineType.TYPE_ZEGO);
|
||||||
|
break;
|
||||||
|
|
||||||
|
default:
|
||||||
|
initRtcEngine(EngineType.TYPE_AGORA);
|
||||||
|
break;
|
||||||
}
|
}
|
||||||
joinChannel(curRoomInfo.getRoomId(), uid);
|
joinChannel(curRoomInfo.getRoomId(), uid);
|
||||||
if (curRoomInfo.getUid() == uid && curRoomInfo.getType() != RoomInfo.ROOMTYPE_HOME_PARTY) {
|
setRole(Constants.CLIENT_ROLE_AUDIENCE);
|
||||||
//设置用户角色为主播,轰趴房不能默认设置房主为主播
|
|
||||||
setRole(Constants.CLIENT_ROLE_BROADCASTER);
|
|
||||||
} else {
|
|
||||||
setRole(Constants.CLIENT_ROLE_AUDIENCE);
|
|
||||||
}
|
|
||||||
}
|
}
|
||||||
|
|
||||||
public void joinChannel(long channelId, long uid) {
|
public void joinChannel(long channelId, long uid) {
|
||||||
@@ -242,8 +249,6 @@ public class AudioEngineManager {
|
|||||||
private int remoteUid;
|
private int remoteUid;
|
||||||
private double accompanyVoice = 0.5;
|
private double accompanyVoice = 0.5;
|
||||||
private double personVoice = 0.5;
|
private double personVoice = 0.5;
|
||||||
@Nullable
|
|
||||||
private KTVKit ktvKit;
|
|
||||||
|
|
||||||
public synchronized void openKtvModel() {
|
public synchronized void openKtvModel() {
|
||||||
|
|
||||||
@@ -267,12 +272,10 @@ public class AudioEngineManager {
|
|||||||
|
|
||||||
|
|
||||||
public void playOrPause() {
|
public void playOrPause() {
|
||||||
if (ktvKit != null) ktvKit.pause();
|
|
||||||
isPlaying = !isPlaying;
|
isPlaying = !isPlaying;
|
||||||
}
|
}
|
||||||
|
|
||||||
public void changeAudioStream() {
|
public void changeAudioStream() {
|
||||||
if (ktvKit != null) ktvKit.switchAudioTrack();
|
|
||||||
isAccompany = !isAccompany;
|
isAccompany = !isAccompany;
|
||||||
}
|
}
|
||||||
|
|
||||||
@@ -281,7 +284,6 @@ public class AudioEngineManager {
|
|||||||
return;
|
return;
|
||||||
}
|
}
|
||||||
accompanyVoice = progress;
|
accompanyVoice = progress;
|
||||||
if (ktvKit != null) ktvKit.adjustAccompanyVolume(progress);
|
|
||||||
}
|
}
|
||||||
|
|
||||||
public void setPersonVoice(double progress) {
|
public void setPersonVoice(double progress) {
|
||||||
@@ -289,7 +291,6 @@ public class AudioEngineManager {
|
|||||||
return;
|
return;
|
||||||
}
|
}
|
||||||
personVoice = progress;
|
personVoice = progress;
|
||||||
if (ktvKit != null) ktvKit.adjustVoiceVolume(personVoice);
|
|
||||||
}
|
}
|
||||||
|
|
||||||
public boolean isPlaying() {
|
public boolean isPlaying() {
|
||||||
@@ -328,17 +329,13 @@ public class AudioEngineManager {
|
|||||||
return personVoice;
|
return personVoice;
|
||||||
}
|
}
|
||||||
|
|
||||||
@Nullable
|
|
||||||
public KTVKit getKtvKit() {
|
|
||||||
return ktvKit;
|
|
||||||
}
|
|
||||||
|
|
||||||
public double getPlayPos() {
|
public double getPlayPos() {
|
||||||
return ktvKit == null ? 0 : ktvKit.getCurrentPosition();
|
return 0;
|
||||||
}
|
}
|
||||||
|
|
||||||
public int getPlayDuration() {
|
public int getPlayDuration() {
|
||||||
return ktvKit == null ? 0 : ktvKit.getDuration();
|
return 0;
|
||||||
}
|
}
|
||||||
|
|
||||||
//ktv相关---------------end--------------------------
|
//ktv相关---------------end--------------------------
|
||||||
|
@@ -2,5 +2,8 @@ package com.yizhuan.xchat_android_core.manager;
|
|||||||
|
|
||||||
public enum EngineType {
|
public enum EngineType {
|
||||||
TYPE_AGORA,
|
TYPE_AGORA,
|
||||||
|
TYPE_AGORA_QUICKNESS,
|
||||||
TYPE_WJ,
|
TYPE_WJ,
|
||||||
|
TYPE_QTT_AUDIO,
|
||||||
|
TYPE_ZEGO,
|
||||||
}
|
}
|
||||||
|
@@ -0,0 +1,60 @@
|
|||||||
|
package com.yizhuan.xchat_android_core.manager.zego;
|
||||||
|
|
||||||
|
import com.zego.zegoaudioroom.ZegoAudioRoomDelegate;
|
||||||
|
import com.zego.zegoaudioroom.ZegoAudioStream;
|
||||||
|
import com.zego.zegoaudioroom.ZegoAudioStreamType;
|
||||||
|
import com.zego.zegoliveroom.entity.ZegoBigRoomMessage;
|
||||||
|
import com.zego.zegoliveroom.entity.ZegoRoomMessage;
|
||||||
|
import com.zego.zegoliveroom.entity.ZegoUserState;
|
||||||
|
|
||||||
|
public class ZegoAudioRoomDelegateWrapper implements ZegoAudioRoomDelegate {
|
||||||
|
@Override
|
||||||
|
public void onKickOut(int i, String s, String s1) {
|
||||||
|
|
||||||
|
}
|
||||||
|
|
||||||
|
@Override
|
||||||
|
public void onDisconnect(int i, String s) {
|
||||||
|
|
||||||
|
}
|
||||||
|
|
||||||
|
@Override
|
||||||
|
public void onStreamUpdate(ZegoAudioStreamType zegoAudioStreamType, ZegoAudioStream zegoAudioStream) {
|
||||||
|
|
||||||
|
}
|
||||||
|
|
||||||
|
@Override
|
||||||
|
public void onUserUpdate(ZegoUserState[] zegoUserStates, int i) {
|
||||||
|
|
||||||
|
}
|
||||||
|
|
||||||
|
@Override
|
||||||
|
public void onUpdateOnlineCount(String s, int i) {
|
||||||
|
|
||||||
|
}
|
||||||
|
|
||||||
|
@Override
|
||||||
|
public void onRecvRoomMessage(String s, ZegoRoomMessage[] zegoRoomMessages) {
|
||||||
|
|
||||||
|
}
|
||||||
|
|
||||||
|
@Override
|
||||||
|
public void onRecvBigRoomMessage(String s, ZegoBigRoomMessage[] zegoBigRoomMessages) {
|
||||||
|
|
||||||
|
}
|
||||||
|
|
||||||
|
@Override
|
||||||
|
public void onRecvCustomCommand(String s, String s1, String s2, String s3) {
|
||||||
|
|
||||||
|
}
|
||||||
|
|
||||||
|
@Override
|
||||||
|
public void onStreamExtraInfoUpdated(ZegoAudioStream[] zegoAudioStreams, String s) {
|
||||||
|
|
||||||
|
}
|
||||||
|
|
||||||
|
@Override
|
||||||
|
public void onTokenWillExpired(String s, int i) {
|
||||||
|
|
||||||
|
}
|
||||||
|
}
|
@@ -0,0 +1,538 @@
|
|||||||
|
package com.yizhuan.xchat_android_core.manager.zego;
|
||||||
|
|
||||||
|
import android.text.TextUtils;
|
||||||
|
import android.util.Log;
|
||||||
|
|
||||||
|
import com.tencent.bugly.crashreport.CrashReport;
|
||||||
|
import com.yizhuan.xchat_android_constants.XChatConstants;
|
||||||
|
import com.yizhuan.xchat_android_core.BuildConfig;
|
||||||
|
import com.yizhuan.xchat_android_core.auth.AuthModel;
|
||||||
|
import com.yizhuan.xchat_android_core.manager.AvRoomDataManager;
|
||||||
|
import com.yizhuan.xchat_android_core.manager.BaseEngine;
|
||||||
|
import com.yizhuan.xchat_android_core.manager.IMNetEaseManager;
|
||||||
|
import com.yizhuan.xchat_android_core.manager.RoomEvent;
|
||||||
|
import com.yizhuan.xchat_android_core.music.db.bean.LocalMusicBean;
|
||||||
|
import com.yizhuan.xchat_android_core.music.model.PlayerModel;
|
||||||
|
import com.yizhuan.xchat_android_core.room.bean.RoomInfo;
|
||||||
|
import com.yizhuan.xchat_android_core.utils.LogUtils;
|
||||||
|
import com.yizhuan.xchat_android_library.utils.JavaUtil;
|
||||||
|
import com.yizhuan.xchat_android_library.utils.config.BasicConfig;
|
||||||
|
import com.yizhuan.xchat_android_library.utils.pref.CommonPref;
|
||||||
|
import com.zego.zegoaudioroom.ZegoAudioLivePublisherDelegate;
|
||||||
|
import com.zego.zegoaudioroom.ZegoAudioRoom;
|
||||||
|
import com.zego.zegoaudioroom.ZegoAudioStream;
|
||||||
|
import com.zego.zegoaudioroom.ZegoAudioStreamType;
|
||||||
|
import com.zego.zegoavkit2.ZegoMediaPlayer;
|
||||||
|
import com.zego.zegoavkit2.soundlevel.IZegoSoundLevelCallback;
|
||||||
|
import com.zego.zegoavkit2.soundlevel.ZegoSoundLevelInfo;
|
||||||
|
import com.zego.zegoavkit2.soundlevel.ZegoSoundLevelMonitor;
|
||||||
|
import com.zego.zegoliveroom.ZegoLiveRoom;
|
||||||
|
import com.zego.zegoliveroom.constants.ZegoConstants;
|
||||||
|
import com.zego.zegoliveroom.entity.ZegoPublishStreamQuality;
|
||||||
|
|
||||||
|
import java.util.HashMap;
|
||||||
|
import java.util.HashSet;
|
||||||
|
import java.util.Set;
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Created by MadisonRong on 2019-12-17
|
||||||
|
* <p>
|
||||||
|
* 我们的 uid 对应 zego 的 streamID
|
||||||
|
*/
|
||||||
|
public class ZegoEngineManager extends BaseEngine {
|
||||||
|
|
||||||
|
private static final String TAG = "ZegoEngineManager";
|
||||||
|
|
||||||
|
private ZegoAudioRoom zegoAudioRoom;
|
||||||
|
private ZegoMediaPlayer zegoMediaPlayer;
|
||||||
|
|
||||||
|
/**
|
||||||
|
* 自己说话时候收到的回调,缓存起来
|
||||||
|
*/
|
||||||
|
private volatile ZegoSoundLevelInfo mySoundLevel;
|
||||||
|
|
||||||
|
private boolean isAudienceRole = false;
|
||||||
|
|
||||||
|
private final Set<String> playStreamIdSet = new HashSet<>();
|
||||||
|
|
||||||
|
private static final class Helper {
|
||||||
|
private static final ZegoEngineManager INSTANCE = new ZegoEngineManager();
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
private ZegoEngineManager() {
|
||||||
|
super();
|
||||||
|
}
|
||||||
|
|
||||||
|
public static ZegoEngineManager get() {
|
||||||
|
return ZegoEngineManager.Helper.INSTANCE;
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
@Override
|
||||||
|
public void enterChannel(long channelId, long uid) {
|
||||||
|
this.uid = uid;
|
||||||
|
initZegoAudioRoom();
|
||||||
|
zegoAudioRoom.loginRoom(String.valueOf(channelId), code -> {
|
||||||
|
//登录没完成就已经leaveChannel了 这里可能会NPE
|
||||||
|
if (zegoAudioRoom == null) return;
|
||||||
|
if (code == 0) {
|
||||||
|
// 重置麦克风和扬声器的状态
|
||||||
|
zegoAudioRoom.enableMic(!isMute);
|
||||||
|
zegoAudioRoom.enableSpeaker(!isRemoteMute);
|
||||||
|
if (isMusicPlaying) {
|
||||||
|
startAudioMixing(PlayerModel.get().getCurrent().getLocalUri(), false, 1);
|
||||||
|
}
|
||||||
|
IMNetEaseManager.get().joinAvRoom();
|
||||||
|
} else {
|
||||||
|
// 登录失败
|
||||||
|
LogUtils.e("Zego onLoginCompletion: code: " + code);
|
||||||
|
CrashReport.postCatchedException(new Throwable("enterChannel failed zegoCode = " + code + "channelId = " + channelId));
|
||||||
|
}
|
||||||
|
});
|
||||||
|
}
|
||||||
|
|
||||||
|
private void initZegoAudioRoom() {
|
||||||
|
// 测试环境开关 (可选设置)
|
||||||
|
boolean debug = BuildConfig.DEBUG && CommonPref.instance(BasicConfig.INSTANCE.getAppContext()).getInt("enviroment") != 0;
|
||||||
|
ZegoAudioRoom.setUseTestEnv(debug);
|
||||||
|
ZegoLiveRoom.setTestEnv(debug);
|
||||||
|
Log.e(TAG, "initRtcEngine: Env: " + debug);
|
||||||
|
// 根据当前运行模式是否打开调试信息,仅供参考 (可选设置)
|
||||||
|
ZegoAudioRoom.setVerbose(BuildConfig.DEBUG);
|
||||||
|
|
||||||
|
// 设置 UserID 和 UserName。userID 和 userName 来自于 App 自定义的账号系统 (必须设置)
|
||||||
|
ZegoAudioRoom.setUser(String.valueOf(uid), String.valueOf(uid));
|
||||||
|
//调用这个接口,会针对满足条件的应用在支持的机型进行适配启用系统的耳返优化的功能
|
||||||
|
ZegoLiveRoom.setConfig("adapt_to_system_karaoke=" + (enableLoopBack ? "true" : "false"));
|
||||||
|
// 采集率 48K
|
||||||
|
ZegoLiveRoom.setConfig("audio_encoder_samplerate=48000");
|
||||||
|
|
||||||
|
ZegoAudioRoom.setAudioDeviceMode(ZegoConstants.AudioDeviceMode.General);
|
||||||
|
zegoAudioRoom = new ZegoAudioRoom();
|
||||||
|
// 初始化 ZegoAudioRoom 对象。AppID 和 AppSign 由 Zego 分配给各 App。其中,为了安全考虑,建议将 AppSign 存储在 App 的业务后台,需要使用时从后台获取 (必须调用)
|
||||||
|
boolean initWithAppId = zegoAudioRoom.initWithAppId(XChatConstants.ZEGO_APP_ID, XChatConstants.ZEGO_APP_SIGN, BasicConfig.INSTANCE.getAppContext());
|
||||||
|
System.out.println("init Zego App: " + initWithAppId);
|
||||||
|
|
||||||
|
adjustAudioMixingVolume(PlayerModel.get().getCurrentVolume());
|
||||||
|
adjustRecordingSignalVolume(PlayerModel.get().getCurrentRecordingVolume());
|
||||||
|
|
||||||
|
// 手动推流
|
||||||
|
zegoAudioRoom.setManualPublish(true);
|
||||||
|
zegoAudioRoom.setManualPlay(true);
|
||||||
|
// 双声道
|
||||||
|
// 设置始终生效,直到重新通过此 API 修改该值或者引擎销毁
|
||||||
|
// 0表示使用单声道采集,非0表示使用双声道采集
|
||||||
|
//ZegoAudioDevice.enableCaptureStereo(2);
|
||||||
|
// 设置编码声道数为双声道
|
||||||
|
// zegoAudioRoom.setAudioChannelCount(2);
|
||||||
|
// 回声消除
|
||||||
|
zegoAudioRoom.enableAEC(true);
|
||||||
|
// 耳机插入状态下使用回声消除
|
||||||
|
zegoAudioRoom.enableAECWhenHeadsetDetected(true);
|
||||||
|
// 音频采集自动增益
|
||||||
|
zegoAudioRoom.enableAGC(true);
|
||||||
|
// 开启离散音频包发送
|
||||||
|
zegoAudioRoom.enableDTX(true);
|
||||||
|
// 初始化是否需要耳返
|
||||||
|
zegoAudioRoom.enableLoopback(enableLoopBack);
|
||||||
|
// 设置码率为 128K
|
||||||
|
zegoAudioRoom.setAudioBitrate(128000);
|
||||||
|
// 配合使用双声道
|
||||||
|
//zegoAudioRoom.setLatencyMode(ZegoConstants.LatencyMode.Low3);
|
||||||
|
zegoAudioRoom.setAudioRoomDelegate(new ZegoAudioRoomDelegateWrapper() {
|
||||||
|
@Override
|
||||||
|
public void onDisconnect(int i, String s) {
|
||||||
|
IMNetEaseManager.postRoomEvent(new RoomEvent().setEvent(RoomEvent.RTC_ENGINE_NETWORK_CLOSE));
|
||||||
|
}
|
||||||
|
|
||||||
|
@Override
|
||||||
|
public void onStreamUpdate(ZegoAudioStreamType zegoAudioStreamType, ZegoAudioStream zegoAudioStream) {
|
||||||
|
super.onStreamUpdate(zegoAudioStreamType, zegoAudioStream);
|
||||||
|
boolean play = zegoAudioStreamType == ZegoAudioStreamType.ZEGO_AUDIO_STREAM_ADD;
|
||||||
|
playStreamId(zegoAudioStream.getStreamId(), play);
|
||||||
|
if (play) {
|
||||||
|
playStreamIdSet.add(zegoAudioStream.getStreamId());
|
||||||
|
} else {
|
||||||
|
playStreamIdSet.remove(zegoAudioStream.getStreamId());
|
||||||
|
}
|
||||||
|
|
||||||
|
LogUtils.d("ZegoAudioStreamType=" + zegoAudioStreamType.name() + " zegoAudioStream=" + zegoAudioStream.getStreamId());
|
||||||
|
}
|
||||||
|
});
|
||||||
|
zegoAudioRoom.setAudioPublisherDelegate(new ZegoAudioLivePublisherDelegate() {
|
||||||
|
@Override
|
||||||
|
public void onPublishStateUpdate(int code, String s, HashMap<String, Object> hashMap) {
|
||||||
|
if (code != 0) {
|
||||||
|
zegoAudioRoom.restartPublishStream();
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
@Override
|
||||||
|
public void onPublishQualityUpdate(String s, ZegoPublishStreamQuality zegoPublishStreamQuality) {
|
||||||
|
|
||||||
|
}
|
||||||
|
});
|
||||||
|
ZegoSoundLevelMonitor.getInstance().setCycle(600);
|
||||||
|
ZegoSoundLevelMonitor.getInstance()
|
||||||
|
.setCallback(new IZegoSoundLevelCallback() {
|
||||||
|
@Override
|
||||||
|
public void onSoundLevelUpdate(ZegoSoundLevelInfo[] zegoSoundLevelInfos) {
|
||||||
|
// 别人说话的时候收到的回调
|
||||||
|
RoomInfo roomInfo = AvRoomDataManager.get().mCurrentRoomInfo;
|
||||||
|
if (roomInfo == null) return;
|
||||||
|
if (speakQueueMembersPosition.size() > 0) {
|
||||||
|
speakQueueMembersPosition.clear();
|
||||||
|
}
|
||||||
|
if (mySoundLevel != null && mySoundLevel.soundLevel > 0) {
|
||||||
|
addToSpeakerList(mySoundLevel);
|
||||||
|
}
|
||||||
|
if (zegoSoundLevelInfos == null || zegoSoundLevelInfos.length == 0) return;
|
||||||
|
for (ZegoSoundLevelInfo speaker : zegoSoundLevelInfos) {
|
||||||
|
LogUtils.d("soundLevel=" + speaker.soundLevel);
|
||||||
|
if (speaker.soundLevel > 0) {
|
||||||
|
addToSpeakerList(speaker);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
IMNetEaseManager.get()
|
||||||
|
.getChatRoomEventObservable()
|
||||||
|
.onNext(new RoomEvent().setEvent(RoomEvent.SPEAK_STATE_CHANGE)
|
||||||
|
.setMicPositionList(speakQueueMembersPosition));
|
||||||
|
}
|
||||||
|
|
||||||
|
@Override
|
||||||
|
public void onCaptureSoundLevelUpdate(ZegoSoundLevelInfo zegoSoundLevelInfo) {
|
||||||
|
// 自己说话的时候收到的回调
|
||||||
|
if (speakQueueMembersPosition.size() > 0) {
|
||||||
|
speakQueueMembersPosition.clear();
|
||||||
|
}
|
||||||
|
if (zegoSoundLevelInfo.soundLevel > 0) {
|
||||||
|
addToSpeakerList(zegoSoundLevelInfo);
|
||||||
|
mySoundLevel = zegoSoundLevelInfo;
|
||||||
|
IMNetEaseManager.get()
|
||||||
|
.getChatRoomEventObservable()
|
||||||
|
.onNext(new RoomEvent().setEvent(RoomEvent.SPEAK_STATE_CHANGE)
|
||||||
|
.setMicPositionList(speakQueueMembersPosition));
|
||||||
|
}
|
||||||
|
|
||||||
|
}
|
||||||
|
});
|
||||||
|
ZegoSoundLevelMonitor.getInstance().start();
|
||||||
|
// 初始化媒体播放器
|
||||||
|
zegoMediaPlayer = new ZegoMediaPlayer();
|
||||||
|
zegoMediaPlayer.init(ZegoMediaPlayer.PlayerTypeAux, 0);
|
||||||
|
zegoMediaPlayer.setEventWithIndexCallback(new ZegoMediaPlayerCallbackWrapper() {
|
||||||
|
@Override
|
||||||
|
public void onPlayEnd(int i) {
|
||||||
|
super.onPlayEnd(i);
|
||||||
|
IMNetEaseManager.get().getChatRoomEventObservable().onNext(
|
||||||
|
new RoomEvent().setEvent(RoomEvent.METHOD_ON_AUDIO_MIXING_FINISHED)
|
||||||
|
);
|
||||||
|
}
|
||||||
|
});
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* 添加到说话者队列里
|
||||||
|
*
|
||||||
|
* @param zegoSoundLevelInfo
|
||||||
|
*/
|
||||||
|
private void addToSpeakerList(ZegoSoundLevelInfo zegoSoundLevelInfo) {
|
||||||
|
int micPosition = getMicPosition(zegoSoundLevelInfo);
|
||||||
|
LogUtils.d("soundLevel=" + zegoSoundLevelInfo.soundLevel + "micPosition=" + micPosition);
|
||||||
|
// 在麦序上,但不在说话者队列里,加入到队列中
|
||||||
|
if (micPosition != Integer.MIN_VALUE &&
|
||||||
|
!speakQueueMembersPosition.contains(micPosition)) {
|
||||||
|
speakQueueMembersPosition.add(micPosition);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* 获取自己的麦位,用来检查自己有没有加到说话者队列里的权限
|
||||||
|
*
|
||||||
|
* @param zegoSoundLevelInfo
|
||||||
|
* @return
|
||||||
|
*/
|
||||||
|
public int getMicPosition(ZegoSoundLevelInfo zegoSoundLevelInfo) {
|
||||||
|
RoomInfo roomInfo = AvRoomDataManager.get().mCurrentRoomInfo;
|
||||||
|
if (roomInfo == null) return Integer.MIN_VALUE;
|
||||||
|
// 计算麦位
|
||||||
|
int uid = getUidFromSteamID(zegoSoundLevelInfo.streamID);
|
||||||
|
// 如果 streamID 为零,则表示这条流是自己
|
||||||
|
uid = uid == 0 ? (int) AuthModel.get().getCurrentUid() : uid;
|
||||||
|
int micPosition = AvRoomDataManager.get().getMicPosition(uid);
|
||||||
|
if (micPosition == Integer.MIN_VALUE &&
|
||||||
|
uid == AuthModel.get().getCurrentUid()) {
|
||||||
|
// 如果麦上没有自己,并且自己在说话,要把自己变成听众
|
||||||
|
setRole(ROLE_AUDIENCE);
|
||||||
|
}
|
||||||
|
//防止黑麦,上麦的时候会重新解除禁言
|
||||||
|
if (micPosition == Integer.MIN_VALUE &&
|
||||||
|
uid != AuthModel.get().getCurrentUid()) {
|
||||||
|
playStreamId(zegoSoundLevelInfo.streamID, false);
|
||||||
|
}
|
||||||
|
LogUtils.d("uid=" + uid + "----micPosition=" + micPosition);
|
||||||
|
return micPosition;
|
||||||
|
}
|
||||||
|
|
||||||
|
@Override
|
||||||
|
public int stopAudioMixing() {
|
||||||
|
if (zegoMediaPlayer != null) {
|
||||||
|
zegoMediaPlayer.stop();
|
||||||
|
isMusicPlaying = false;
|
||||||
|
}
|
||||||
|
return 0;
|
||||||
|
}
|
||||||
|
|
||||||
|
@Override
|
||||||
|
public void resetChannel() {
|
||||||
|
if (zegoAudioRoom != null) {
|
||||||
|
removeCallbacks();
|
||||||
|
zegoAudioRoom.logoutRoom();
|
||||||
|
zegoAudioRoom = null;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
@Override
|
||||||
|
public void reEnterChannel(long channelId, long uid) {
|
||||||
|
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
@Override
|
||||||
|
public void leaveChannel() {
|
||||||
|
if (zegoAudioRoom != null) {
|
||||||
|
stopAudioMixing();
|
||||||
|
removeCallbacks();
|
||||||
|
zegoAudioRoom.logoutRoom();
|
||||||
|
zegoAudioRoom = null;
|
||||||
|
try {
|
||||||
|
ZegoSoundLevelMonitor.getInstance().stop();
|
||||||
|
} catch (Exception e) {
|
||||||
|
e.printStackTrace();
|
||||||
|
} catch (UnsatisfiedLinkError ignore) {
|
||||||
|
}
|
||||||
|
}
|
||||||
|
if (zegoMediaPlayer != null) {
|
||||||
|
zegoMediaPlayer.uninit();
|
||||||
|
}
|
||||||
|
isMute = false;
|
||||||
|
isRemoteMute = false;
|
||||||
|
needRecord = false;
|
||||||
|
isAudienceRole = false;
|
||||||
|
}
|
||||||
|
|
||||||
|
// 移除所有回调
|
||||||
|
private void removeCallbacks() {
|
||||||
|
zegoAudioRoom.setAudioRoomDelegate(null);
|
||||||
|
zegoAudioRoom.setAudioPublisherDelegate(null);
|
||||||
|
zegoAudioRoom.setAudioPlayerDelegate(null);
|
||||||
|
zegoAudioRoom.setAudioLiveEventDelegate(null);
|
||||||
|
zegoAudioRoom.setAudioRecordDelegate(null);
|
||||||
|
zegoAudioRoom.setAudioDeviceEventDelegate(null);
|
||||||
|
zegoAudioRoom.setAudioAVEngineDelegate(null);
|
||||||
|
}
|
||||||
|
|
||||||
|
@Override
|
||||||
|
public void setRemoteMute(boolean mute) {
|
||||||
|
if (zegoAudioRoom == null) {
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
boolean result = zegoAudioRoom.enableSpeaker(!mute);
|
||||||
|
if (result) {
|
||||||
|
isRemoteMute = mute;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
@Override
|
||||||
|
public boolean isEnableLoopBack() {
|
||||||
|
return false;
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
public void playStreamIdByUid(long uid, boolean play) {
|
||||||
|
for (String streamId : playStreamIdSet) {
|
||||||
|
if (uid == getUidFromSteamID(streamId)) {
|
||||||
|
playStreamId(streamId, play);
|
||||||
|
break;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
public void playStreamId(String streamId, boolean play) {
|
||||||
|
if (zegoAudioRoom == null) {
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
if (play) {
|
||||||
|
zegoAudioRoom.startPlay(streamId);
|
||||||
|
} else {
|
||||||
|
zegoAudioRoom.stopPlay(streamId);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
@Override
|
||||||
|
public boolean setRole(int role) {
|
||||||
|
if (zegoAudioRoom == null) {
|
||||||
|
return false;
|
||||||
|
}
|
||||||
|
if (!isMute) {
|
||||||
|
if (role == ROLE_BROADCASTER ) {
|
||||||
|
zegoAudioRoom.startPublish();
|
||||||
|
} else if (role == ROLE_AUDIENCE) {
|
||||||
|
zegoAudioRoom.stopPublish();
|
||||||
|
}
|
||||||
|
isAudienceRole = role != ROLE_BROADCASTER;
|
||||||
|
}
|
||||||
|
|
||||||
|
return true;
|
||||||
|
}
|
||||||
|
|
||||||
|
@Override
|
||||||
|
public void setMute(boolean mute) {
|
||||||
|
if (zegoAudioRoom == null || zegoMediaPlayer == null) {
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
zegoAudioRoom.enableMic(!mute);
|
||||||
|
if (mute) {
|
||||||
|
zegoAudioRoom.stopPublish();
|
||||||
|
isMute = true;
|
||||||
|
// 清空缓存,表示自己没有在说话
|
||||||
|
mySoundLevel = null;
|
||||||
|
} else {
|
||||||
|
zegoAudioRoom.startPublish();
|
||||||
|
isMute = false;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
@Override
|
||||||
|
public void switchLoopBack(boolean enableLoopBack) {
|
||||||
|
super.switchLoopBack(enableLoopBack);
|
||||||
|
}
|
||||||
|
|
||||||
|
@Override
|
||||||
|
public void setChatRoomOnlineStatus(boolean status) {
|
||||||
|
|
||||||
|
}
|
||||||
|
|
||||||
|
@Override
|
||||||
|
public void setASMRMode(boolean enable) {
|
||||||
|
|
||||||
|
}
|
||||||
|
|
||||||
|
@Override
|
||||||
|
public void adjustAudioMixingVolume(int volume) {
|
||||||
|
if (zegoMediaPlayer == null) {
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
zegoMediaPlayer.setVolume(getZegoVolumeByLinearValue(volume));
|
||||||
|
}
|
||||||
|
|
||||||
|
@Override
|
||||||
|
public void adjustRecordingSignalVolume(int volume) {
|
||||||
|
if (zegoAudioRoom == null) {
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
zegoAudioRoom.setCaptureVolume(getZegoVolumeByLinearValue(volume));
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* zego 提供的音量转变方法
|
||||||
|
*
|
||||||
|
* @param linearValue
|
||||||
|
* @return
|
||||||
|
*/
|
||||||
|
private static int getZegoVolumeByLinearValue(int linearValue) {
|
||||||
|
float fVolume = linearValue / 100f;
|
||||||
|
float db = (float) Math.log10(fVolume) * 20;
|
||||||
|
if (db > 0) {
|
||||||
|
db = 0;
|
||||||
|
} else if (db < -40) {
|
||||||
|
db = -40;
|
||||||
|
}
|
||||||
|
|
||||||
|
// 0 ~ 15 db
|
||||||
|
if (db > -15) {
|
||||||
|
return (int) ((db / 30 + 1) * 100);
|
||||||
|
} else if (db > -27) {
|
||||||
|
return (int) ((db + 35) / 40 * 100);
|
||||||
|
} else {
|
||||||
|
return (int) ((db + 40) / 65 * 100);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
@Override
|
||||||
|
public int resumeAudioMixing() {
|
||||||
|
if (zegoMediaPlayer == null) {
|
||||||
|
return -1;
|
||||||
|
}
|
||||||
|
if (zegoMediaPlayer.getCurrentDuration() > 0) {
|
||||||
|
zegoMediaPlayer.resume();
|
||||||
|
} else {
|
||||||
|
LocalMusicBean current = PlayerModel.get().getCurrent();
|
||||||
|
startAudioMixing(current.getLocalUri(), false, 1);
|
||||||
|
}
|
||||||
|
isMusicPlaying = true;
|
||||||
|
return 0;
|
||||||
|
}
|
||||||
|
|
||||||
|
@Override
|
||||||
|
public int pauseAudioMixing() {
|
||||||
|
if (zegoMediaPlayer == null) {
|
||||||
|
return -1;
|
||||||
|
}
|
||||||
|
zegoMediaPlayer.pause();
|
||||||
|
isMusicPlaying = false;
|
||||||
|
return 0;
|
||||||
|
}
|
||||||
|
|
||||||
|
@Override
|
||||||
|
public int startAudioMixing(String filePath, boolean loopback, int cycle) {
|
||||||
|
if (zegoMediaPlayer == null || TextUtils.isEmpty(filePath)) {
|
||||||
|
return -1;
|
||||||
|
}
|
||||||
|
zegoMediaPlayer.stop();
|
||||||
|
zegoMediaPlayer.start(filePath, loopback);
|
||||||
|
isMusicPlaying = true;
|
||||||
|
return 0;
|
||||||
|
}
|
||||||
|
|
||||||
|
@Override
|
||||||
|
public int getAudioMixingCurrentPosition() {
|
||||||
|
if (zegoMediaPlayer == null) {
|
||||||
|
return -1;
|
||||||
|
}
|
||||||
|
return (int) zegoMediaPlayer.getCurrentDuration();
|
||||||
|
}
|
||||||
|
|
||||||
|
@Override
|
||||||
|
public int getAudioMixingDuration() {
|
||||||
|
if (zegoMediaPlayer == null) {
|
||||||
|
return -1;
|
||||||
|
}
|
||||||
|
return (int) zegoMediaPlayer.getDuration();
|
||||||
|
}
|
||||||
|
|
||||||
|
@Override
|
||||||
|
public void setRemoteMute(long uid, boolean mute) {
|
||||||
|
playStreamIdByUid(uid, mute);
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
/**
|
||||||
|
* streamID 的格式是 s-[uid]-[随机数]
|
||||||
|
*
|
||||||
|
* @param streamID
|
||||||
|
* @return
|
||||||
|
*/
|
||||||
|
private int getUidFromSteamID(String streamID) {
|
||||||
|
if (TextUtils.isEmpty(streamID)) {
|
||||||
|
return -2;
|
||||||
|
}
|
||||||
|
String[] strings = streamID.split("-");
|
||||||
|
if (strings.length <= 1) {
|
||||||
|
return -1;
|
||||||
|
}
|
||||||
|
String uid = strings[1];
|
||||||
|
return JavaUtil.str2int(uid);
|
||||||
|
}
|
||||||
|
}
|
@@ -0,0 +1,84 @@
|
|||||||
|
package com.yizhuan.xchat_android_core.manager.zego;
|
||||||
|
|
||||||
|
import android.graphics.Bitmap;
|
||||||
|
|
||||||
|
import com.zego.zegoavkit2.IZegoMediaPlayerWithIndexCallback;
|
||||||
|
|
||||||
|
|
||||||
|
public class ZegoMediaPlayerCallbackWrapper implements IZegoMediaPlayerWithIndexCallback {
|
||||||
|
|
||||||
|
@Override
|
||||||
|
public void onPlayStart(int i) {
|
||||||
|
|
||||||
|
}
|
||||||
|
|
||||||
|
@Override
|
||||||
|
public void onPlayPause(int i) {
|
||||||
|
|
||||||
|
}
|
||||||
|
|
||||||
|
@Override
|
||||||
|
public void onPlayStop(int i) {
|
||||||
|
|
||||||
|
}
|
||||||
|
|
||||||
|
@Override
|
||||||
|
public void onPlayResume(int i) {
|
||||||
|
|
||||||
|
}
|
||||||
|
|
||||||
|
@Override
|
||||||
|
public void onPlayError(int i, int i1) {
|
||||||
|
|
||||||
|
}
|
||||||
|
|
||||||
|
@Override
|
||||||
|
public void onVideoBegin(int i) {
|
||||||
|
|
||||||
|
}
|
||||||
|
|
||||||
|
@Override
|
||||||
|
public void onAudioBegin(int i) {
|
||||||
|
|
||||||
|
}
|
||||||
|
|
||||||
|
@Override
|
||||||
|
public void onPlayEnd(int i) {
|
||||||
|
|
||||||
|
}
|
||||||
|
|
||||||
|
@Override
|
||||||
|
public void onBufferBegin(int i) {
|
||||||
|
|
||||||
|
}
|
||||||
|
|
||||||
|
@Override
|
||||||
|
public void onBufferEnd(int i) {
|
||||||
|
|
||||||
|
}
|
||||||
|
|
||||||
|
@Override
|
||||||
|
public void onSeekComplete(int i, long l, int i1) {
|
||||||
|
|
||||||
|
}
|
||||||
|
|
||||||
|
@Override
|
||||||
|
public void onSnapshot(Bitmap bitmap, int i) {
|
||||||
|
|
||||||
|
}
|
||||||
|
|
||||||
|
@Override
|
||||||
|
public void onLoadComplete(int i) {
|
||||||
|
|
||||||
|
}
|
||||||
|
|
||||||
|
@Override
|
||||||
|
public void onProcessInterval(long l, int i) {
|
||||||
|
|
||||||
|
}
|
||||||
|
|
||||||
|
@Override
|
||||||
|
public void onReadEOF(int i) {
|
||||||
|
|
||||||
|
}
|
||||||
|
}
|
@@ -6,4 +6,6 @@ package com.yizhuan.xchat_android_core.room.bean;
|
|||||||
public interface RoomAudioSdkType {
|
public interface RoomAudioSdkType {
|
||||||
String SHENGWANG = "shengwang"; //声网
|
String SHENGWANG = "shengwang"; //声网
|
||||||
String WUJIE = "wujie"; //无界
|
String WUJIE = "wujie"; //无界
|
||||||
|
String ZEGO = "zego"; //zego
|
||||||
|
|
||||||
}
|
}
|
||||||
|
Reference in New Issue
Block a user