语音SDK新增ZEGO

(cherry picked from commit ff50cd4239df1327283337c2036d9ec90caafaa0)
This commit is contained in:
huangjian
2021-07-15 15:55:02 +08:00
parent 32c67af3da
commit 698c0a7531
9 changed files with 716 additions and 24 deletions

Binary file not shown.

BIN
core/libs/zegoaudioroom.jar Normal file

Binary file not shown.

View File

@@ -288,4 +288,12 @@ public class XChatConstants {
// public static final String QUICK_PASS_BUSINESS_ID = BuildConfig.DEBUG ? "cadbb4ed892549dab4d1adc9d62013bb" : "ba4a642810294561b9cd17034a448b49";
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
};
}

View File

@@ -1,17 +1,16 @@
package com.yizhuan.xchat_android_core.manager;
import androidx.annotation.Nullable;
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.wj.WJAudioConstant;
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.RoomInfo;
import com.yizhuan.xchat_android_core.user.UserModel;
import com.yizhuan.xchat_android_core.utils.LogUtils;
import io.agora.ktvkit.KTVKit;
import io.agora.rtc.Constants;
import io.agora.rtc.video.VideoCanvas;
@@ -40,6 +39,9 @@ public class AudioEngineManager {
}
this.iAudioEngine = WJAudioEngineManager.get();
break;
case TYPE_ZEGO:
this.iAudioEngine = ZegoEngineManager.get();
break;
case TYPE_AGORA:
default:
this.iAudioEngine = RtcEngineManager.get();
@@ -52,18 +54,23 @@ public class AudioEngineManager {
RoomInfo curRoomInfo = AvRoomDataManager.get().mCurrentRoomInfo;
if (curRoomInfo == null) return;
if (iAudioEngine != null) iAudioEngine.leaveChannel();
if (RoomAudioSdkType.WUJIE.equals(audioSdkType)) {
AudioEngineManager.get().initRtcEngine(EngineType.TYPE_WJ);
} else {
AudioEngineManager.get().initRtcEngine(EngineType.TYPE_AGORA);
if (audioSdkType == null) audioSdkType = RoomAudioSdkType.SHENGWANG;
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);
if (curRoomInfo.getUid() == uid && curRoomInfo.getType() != RoomInfo.ROOMTYPE_HOME_PARTY) {
//设置用户角色为主播,轰趴房不能默认设置房主为主播
setRole(Constants.CLIENT_ROLE_BROADCASTER);
} else {
setRole(Constants.CLIENT_ROLE_AUDIENCE);
}
setRole(Constants.CLIENT_ROLE_AUDIENCE);
}
public void joinChannel(long channelId, long uid) {
@@ -242,8 +249,6 @@ public class AudioEngineManager {
private int remoteUid;
private double accompanyVoice = 0.5;
private double personVoice = 0.5;
@Nullable
private KTVKit ktvKit;
public synchronized void openKtvModel() {
@@ -267,12 +272,10 @@ public class AudioEngineManager {
public void playOrPause() {
if (ktvKit != null) ktvKit.pause();
isPlaying = !isPlaying;
}
public void changeAudioStream() {
if (ktvKit != null) ktvKit.switchAudioTrack();
isAccompany = !isAccompany;
}
@@ -281,7 +284,6 @@ public class AudioEngineManager {
return;
}
accompanyVoice = progress;
if (ktvKit != null) ktvKit.adjustAccompanyVolume(progress);
}
public void setPersonVoice(double progress) {
@@ -289,7 +291,6 @@ public class AudioEngineManager {
return;
}
personVoice = progress;
if (ktvKit != null) ktvKit.adjustVoiceVolume(personVoice);
}
public boolean isPlaying() {
@@ -328,17 +329,13 @@ public class AudioEngineManager {
return personVoice;
}
@Nullable
public KTVKit getKtvKit() {
return ktvKit;
}
public double getPlayPos() {
return ktvKit == null ? 0 : ktvKit.getCurrentPosition();
return 0;
}
public int getPlayDuration() {
return ktvKit == null ? 0 : ktvKit.getDuration();
return 0;
}
//ktv相关---------------end--------------------------

View File

@@ -2,5 +2,8 @@ package com.yizhuan.xchat_android_core.manager;
public enum EngineType {
TYPE_AGORA,
TYPE_AGORA_QUICKNESS,
TYPE_WJ,
TYPE_QTT_AUDIO,
TYPE_ZEGO,
}

View File

@@ -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) {
}
}

View File

@@ -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);
}
}

View File

@@ -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) {
}
}

View File

@@ -6,4 +6,6 @@ package com.yizhuan.xchat_android_core.room.bean;
public interface RoomAudioSdkType {
String SHENGWANG = "shengwang"; //声网
String WUJIE = "wujie"; //无界
String ZEGO = "zego"; //zego
}