From 1c655fb208bc31d1070d3ce254afe8b5e21012f0 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=E8=91=A3=E5=AE=8F=E5=AE=87?= Date: Wed, 3 Feb 2021 18:19:06 +0800 Subject: [PATCH] =?UTF-8?q?=E4=BF=AE=E5=A4=8D=E4=B8=AD=E9=97=B4=E5=81=9C?= =?UTF-8?q?=E6=AD=A2=E6=8E=A8=E9=80=81=E5=90=8E=EF=BC=8C=E5=86=8D=E6=AC=A1?= =?UTF-8?q?=E5=BC=80=E5=90=AF=E6=8E=A8=E9=80=81=E5=BC=82=E5=B8=B8?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../cloud/live/manager/ZeGoLiveManager.java | 156 ++++++++++-------- .../mogo/cloud/live/server/PushService.java | 11 +- settings.gradle | 3 - 3 files changed, 96 insertions(+), 74 deletions(-) diff --git a/foudations/mogo-live/src/main/java/com/mogo/cloud/live/manager/ZeGoLiveManager.java b/foudations/mogo-live/src/main/java/com/mogo/cloud/live/manager/ZeGoLiveManager.java index b4e0d49..b0dfa1a 100644 --- a/foudations/mogo-live/src/main/java/com/mogo/cloud/live/manager/ZeGoLiveManager.java +++ b/foudations/mogo-live/src/main/java/com/mogo/cloud/live/manager/ZeGoLiveManager.java @@ -55,6 +55,7 @@ public class ZeGoLiveManager { * 存储即构的日志路径 */ private static final String ZEGO_LOG_PATH = Environment.getExternalStorageDirectory().getAbsolutePath() + "/ZegoLog"; + private Application mApplication; /** * 直播推送配置对象 */ @@ -87,6 +88,10 @@ public class ZeGoLiveManager { * 当前的房间ID */ private String currentRoomId = ""; + /** + * 自定义采集状态,true-初始化完成,false-没有初始化 + */ + private boolean isCaptureStatus; /** * 推送状态,true-推流中,false-没有推流 */ @@ -126,6 +131,10 @@ public class ZeGoLiveManager { return isPushing; } + public boolean isCaptureStatus() { + return isCaptureStatus; + } + /** * 初始化直播SDK * @@ -133,6 +142,7 @@ public class ZeGoLiveManager { * @param livePushConfig 是否需要配置 */ public void init(Application application, MGLivePushConfig livePushConfig) { + mApplication = application; mLivePushConfig = livePushConfig; // 通过 advancedConfig 设置 uuid 过滤字段,设置之后 SDK 只会抛出前 12 个字节为开发者所设置 uuid 的 SEI ZegoEngineConfig zegoEngineConfig = new ZegoEngineConfig(); @@ -144,61 +154,6 @@ public class ZeGoLiveManager { zegoEngineConfig.logConfig = zegoLogConfig; // 设置配置到引擎中 ZegoExpressEngine.setEngineConfig(zegoEngineConfig); - // 创建 enging 对象, appID, appSign 为开发者在 ZEGO 管理控制台申请的凭证信息, - // 未上线的开发者 isTestEnvironment 为 true, application 为安卓应用的上下文 - mExpressEngine = - ZegoExpressEngine.createEngine( - appId, - appKey, - true, - ZegoScenario.GENERAL, - application, - mEventHandler); - if (mLivePushConfig != null) { - // 创建自定义视频采集对象 - customVideoCaptureConfig = new ZegoCustomVideoCaptureConfig(); - // 设置自定义视频采集视频帧数据类型 - customVideoCaptureConfig.bufferType = ZegoVideoBufferType.RAW_DATA; - // true 表示静音(关闭) - mExpressEngine.muteMicrophone(true); - // 开始或停止自定义视频采集,支持设置其他通道的推流 - mExpressEngine.enableCustomVideoCapture(true, customVideoCaptureConfig, ZegoPublishChannel.MAIN); - // 设置自定义视频采集回调 - mExpressEngine.setCustomVideoCaptureHandler(new IZegoCustomVideoCaptureHandler() { - @Override - public void onStart(ZegoPublishChannel channel) { - super.onStart(channel); - Log.i(TAG, "setCustomVideoCaptureHandler onStart"); - if (listener != null) { - listener.onStart(); - } - } - - @Override - public void onStop(ZegoPublishChannel channel) { - super.onStop(channel); - Log.i(TAG, "setCustomVideoCaptureHandler onStop"); - if (listener != null) { - listener.onStop(); - } - } - }); - - // 视频配追 - ZegoVideoConfig zegoVideoConfig = new ZegoVideoConfig(); - // 采集分辨率,控制摄像头图像采集的分辨率。SDK 要求将宽和高设置为偶数。 - zegoVideoConfig.setCaptureResolution(mLivePushConfig.getWidth(), mLivePushConfig.getHeight()); - // 编码分辨率,控制编码器编码推流的图像分辨率。SDK 要求将宽和高设置为偶数。推流前后设置均可生效 - zegoVideoConfig.setEncodeResolution(mLivePushConfig.getWidth(), mLivePushConfig.getHeight()); - // 设置视频帧率 - zegoVideoConfig.setVideoFPS(mLivePushConfig.getVideoFPS()); - // 设置视频比特率 - zegoVideoConfig.setVideoBitrate(mLivePushConfig.getVideoBitrate()); - // 设置转码的ID,使用H.264 - zegoVideoConfig.setCodecID(ZegoVideoCodecID.DEFAULT); - // 将视频信息设置到推流引擎 - mExpressEngine.setVideoConfig(zegoVideoConfig); - } } /** @@ -209,6 +164,7 @@ public class ZeGoLiveManager { @Override public void onDebugError(int errorCode, String funcName, String info) { super.onDebugError(errorCode, funcName, info); + Log.i(TAG, "onDebugError errorCode : " + errorCode); if (listener != null) { listener.onDebugError(errorCode, funcName, info); } @@ -235,6 +191,7 @@ public class ZeGoLiveManager { @Override public void onRoomStateUpdate(String roomID, ZegoRoomState state, int errorCode, JSONObject extendedData) { super.onRoomStateUpdate(roomID, state, errorCode, extendedData); + Log.i(TAG, "onRoomStateUpdate roomID : " + roomID + " state:" + state + " errorCode:" + errorCode); //房间状态更新 if (state == ZegoRoomState.CONNECTING) { if (listener != null) { @@ -255,14 +212,14 @@ public class ZeGoLiveManager { public void onRoomUserUpdate(String roomID, ZegoUpdateType updateType, ArrayList userList) { super.onRoomUserUpdate(roomID, updateType, userList); //用户状态更新 - Log.i(TAG, "onRoomUserUpdate roomId 房间内其他用户增加或减少的通知回调: " + roomID + " , updateType : " + updateType.name()); + Log.i(TAG, "onRoomUserUpdate roomId : " + roomID + " , updateType : " + updateType.name()); } @Override public void onRoomStreamUpdate(String roomID, ZegoUpdateType updateType, ArrayList streamList, JSONObject extendedData) { super.onRoomStreamUpdate(roomID, updateType, streamList, extendedData); //有用户新推送或者删除音视频时,更新流状态 - Log.i(TAG, "onRoomStreamUpdate roomId 相同房间内其他用户推的流增加或减少的通知: " + roomID + " , ZegoUpdateType : " + updateType.name()); + Log.i(TAG, "onRoomStreamUpdate roomId : " + roomID + " , ZegoUpdateType : " + updateType.name()); for (ZegoStream stream : streamList) { String streamID = stream.streamID; Log.i(TAG, "onRoomStreamUpdate streamId: " + streamID); @@ -278,21 +235,21 @@ public class ZeGoLiveManager { public void onPublisherStateUpdate(String streamID, ZegoPublisherState state, int errorCode, JSONObject extendedData) { super.onPublisherStateUpdate(streamID, state, errorCode, extendedData); - Log.i(TAG, "onPublisherStateUpdate streamID 推流状态回调: " + streamID + " , state : " + state.name() + " , errorCode : " + errorCode); + Log.i(TAG, "onPublisherStateUpdate streamID : " + streamID + " , state : " + state.name() + " , errorCode : " + errorCode); isPushing = state == ZegoPublisherState.PUBLISHING; } @Override public void onPlayerStateUpdate(String streamID, ZegoPlayerState state, int errorCode, JSONObject extendedData) { super.onPlayerStateUpdate(streamID, state, errorCode, extendedData); - Log.i(TAG, "onPlayerStateUpdate streamId 拉流状态变更回调: " + streamID + " , state : " + state.name() + " , errorCode : " + errorCode + " , extendData : " + extendedData.toString()); + Log.i(TAG, "onPlayerStateUpdate streamId : " + streamID + " , state : " + state.name() + " , errorCode : " + errorCode + " , extendData : " + extendedData.toString()); isPlaying = state == ZegoPlayerState.PLAYING; } @Override public void onPlayerQualityUpdate(String streamID, ZegoPlayStreamQuality quality) { super.onPlayerQualityUpdate(streamID, quality); - Log.i(TAG, "onPlayerQualityUpdate quality 拉流质量回调: " + quality.toString()); + Log.i(TAG, "onPlayerQualityUpdate quality : " + quality.toString()); } @Override @@ -329,11 +286,74 @@ public class ZeGoLiveManager { * @param roomId 要进入的房间ID */ public void loginRoom(String userId, String roomId) { + initCustomVideoCapture(); currentRoomId = ROOM_ID_PREFIX + roomId; ZegoUser zegoUser = new ZegoUser(userId, NAME_PREFIX + userId); mExpressEngine.loginRoom(currentRoomId, zegoUser); } + /** + * 初始化自定义采集 + */ + private void initCustomVideoCapture() { + // 创建 enging 对象, appID, appSign 为开发者在 ZEGO 管理控制台申请的凭证信息, + // 未上线的开发者 isTestEnvironment 为 true, application 为安卓应用的上下文 + mExpressEngine = ZegoExpressEngine.createEngine( + appId, + appKey, + true, + ZegoScenario.GENERAL, + mApplication, + mEventHandler); + if (mLivePushConfig != null) { + // 创建自定义视频采集对象 + customVideoCaptureConfig = new ZegoCustomVideoCaptureConfig(); + // 设置自定义视频采集视频帧数据类型 + customVideoCaptureConfig.bufferType = ZegoVideoBufferType.RAW_DATA; + // true 表示静音(关闭) + mExpressEngine.muteMicrophone(true); + // 开始或停止自定义视频采集,支持设置其他通道的推流 + mExpressEngine.enableCustomVideoCapture(true, customVideoCaptureConfig, ZegoPublishChannel.MAIN); + // 设置自定义视频采集回调 + mExpressEngine.setCustomVideoCaptureHandler(new IZegoCustomVideoCaptureHandler() { + @Override + public void onStart(ZegoPublishChannel channel) { + super.onStart(channel); + Log.i(TAG, "setCustomVideoCaptureHandler onStart"); + isCaptureStatus = true; + if (listener != null) { + listener.onStart(); + } + } + + @Override + public void onStop(ZegoPublishChannel channel) { + super.onStop(channel); + Log.i(TAG, "setCustomVideoCaptureHandler onStop"); + isCaptureStatus = false; + if (listener != null) { + listener.onStop(); + } + } + }); + + // 视频配追 + ZegoVideoConfig zegoVideoConfig = new ZegoVideoConfig(); + // 采集分辨率,控制摄像头图像采集的分辨率。SDK 要求将宽和高设置为偶数。 + zegoVideoConfig.setCaptureResolution(mLivePushConfig.getWidth(), mLivePushConfig.getHeight()); + // 编码分辨率,控制编码器编码推流的图像分辨率。SDK 要求将宽和高设置为偶数。推流前后设置均可生效 + zegoVideoConfig.setEncodeResolution(mLivePushConfig.getWidth(), mLivePushConfig.getHeight()); + // 设置视频帧率 + zegoVideoConfig.setVideoFPS(mLivePushConfig.getVideoFPS()); + // 设置视频比特率 + zegoVideoConfig.setVideoBitrate(mLivePushConfig.getVideoBitrate()); + // 设置转码的ID,使用H.264 + zegoVideoConfig.setCodecID(ZegoVideoCodecID.DEFAULT); + // 将视频信息设置到推流引擎 + mExpressEngine.setVideoConfig(zegoVideoConfig); + } + } + /** * 退出房间 */ @@ -381,13 +401,15 @@ public class ZeGoLiveManager { * @param referenceTimeMillisecond 视频帧参考时间,UNIX时间戳,以毫秒为单位。音视频同步用的, */ public void startPublishingStream(ByteBuffer byteBuffer, int dataLength, long referenceTimeMillisecond) { - ZegoVideoFrameParam zegoVideoFrameParam = new ZegoVideoFrameParam(); - zegoVideoFrameParam.format = ZegoVideoFrameFormat.I420; - zegoVideoFrameParam.width = mLivePushConfig.getWidth(); - zegoVideoFrameParam.height = mLivePushConfig.getHeight(); - zegoVideoFrameParam.strides[0] = mLivePushConfig.getWidth(); - zegoVideoFrameParam.strides[1] = mLivePushConfig.getWidth(); - mExpressEngine.sendCustomVideoCaptureRawData(byteBuffer, dataLength, zegoVideoFrameParam, referenceTimeMillisecond); + if (mExpressEngine != null) { + ZegoVideoFrameParam zegoVideoFrameParam = new ZegoVideoFrameParam(); + zegoVideoFrameParam.format = ZegoVideoFrameFormat.I420; + zegoVideoFrameParam.width = mLivePushConfig.getWidth(); + zegoVideoFrameParam.height = mLivePushConfig.getHeight(); + zegoVideoFrameParam.strides[0] = mLivePushConfig.getWidth(); + zegoVideoFrameParam.strides[1] = mLivePushConfig.getWidth(); + mExpressEngine.sendCustomVideoCaptureRawData(byteBuffer, dataLength, zegoVideoFrameParam, referenceTimeMillisecond); + } } /** diff --git a/foudations/mogo-live/src/main/java/com/mogo/cloud/live/server/PushService.java b/foudations/mogo-live/src/main/java/com/mogo/cloud/live/server/PushService.java index 24d688c..c66ba4a 100644 --- a/foudations/mogo-live/src/main/java/com/mogo/cloud/live/server/PushService.java +++ b/foudations/mogo-live/src/main/java/com/mogo/cloud/live/server/PushService.java @@ -97,16 +97,18 @@ public class PushService extends Service implements IYUVDataListener { */ private void startPush(String devicesId) { if (mDevicesId != null && mDevicesId.equals(devicesId) - && mLivePusher != null && mLivePusher.isPushing()) { + && mLivePusher != null + && mLivePusher.isCaptureStatus() + && mLivePusher.isPushing()) { return; } mDevicesId = devicesId; - // 注册视频YUV回调监听 - CameraFrameManager.getInstance().addYuvDataCallback(this); // 登录房间 mLivePusher.loginRoom(mDevicesId, mDevicesId); // 开始发布 mLivePusher.startPush(mDevicesId); + // 注册视频YUV回调监听 + CameraFrameManager.getInstance().addYuvDataCallback(this); Log.d(TAG, "startPush :mRoomId=" + mDevicesId + " mDevicesId=" + mDevicesId); } @@ -130,7 +132,8 @@ public class PushService extends Service implements IYUVDataListener { @Override public void onFrame(byte[] data) { - if (mLivePusher != null && mLivePusher.isPushing() && data != null) { + if (mLivePusher != null && mLivePusher.isCaptureStatus() + && mLivePusher.isPushing() && data != null) { // 将YUV数据发布到即构 ZeGoLiveManager.getInstance().startPublishingStream( ByteUtils.getBuffer(data, data.length), data.length, diff --git a/settings.gradle b/settings.gradle index 9cb204f..43363df 100644 --- a/settings.gradle +++ b/settings.gradle @@ -1,8 +1,5 @@ -<<<<<<< HEAD include ':modules:mogo-trafficlive' -======= include ':foudations:mogo-common' ->>>>>>> f325f43171aed36ba51557ef5340f1758bdb1543 include ':foudations:mogo-live' include ':foudations:mogo-socket' include ':modules:mogo-realtime'