Kaynağa Gözat

Merge branch 'dev_20230222_live' into master_saas

Eric 2 yıl önce
ebeveyn
işleme
0c42ab6774

+ 3 - 1
mec-biz/src/main/java/com/ym/mec/biz/service/impl/ImLiveBroadcastRoomServiceImpl.java

@@ -2,6 +2,7 @@ package com.ym.mec.biz.service.impl;
 
 import com.alibaba.fastjson.JSON;
 import com.alibaba.fastjson.JSONObject;
+import com.baomidou.mybatisplus.core.conditions.query.QueryWrapper;
 import com.baomidou.mybatisplus.core.metadata.IPage;
 import com.baomidou.mybatisplus.core.toolkit.Wrappers;
 import com.baomidou.mybatisplus.extension.plugins.pagination.Page;
@@ -31,6 +32,7 @@ import com.ym.mec.biz.dal.entity.ImLiveBroadcastRoom;
 import com.ym.mec.biz.dal.entity.ImLiveBroadcastRoomData;
 import com.ym.mec.biz.dal.entity.ImLiveBroadcastRoomMember;
 import com.ym.mec.biz.dal.entity.ImLiveRoomBlack;
+import com.ym.mec.biz.dal.entity.ImLiveRoomVideo;
 import com.ym.mec.biz.dal.enums.MessageTypeEnum;
 import com.ym.mec.biz.dal.page.LiveRoomGoodsOrderQueryInfo;
 import com.ym.mec.biz.dal.vo.*;
@@ -1311,7 +1313,7 @@ public class ImLiveBroadcastRoomServiceImpl extends ServiceImpl<ImLiveBroadcastR
                 RTCRoom.RecordResp recordResp = pluginService.rtcRoomRecordStart(RTCRequest.RecordStart.builder()
                         .startTime(dateTime.plusMillis(5).getMillis() / 1000)
                         .endTime(dateTime.plusDays(1).getMillis() / 1000)
-                        .steamName(MessageFormat.format("{0}_{1}", imLiveBroadcastRoomVo.getRoomUid(), String.valueOf(imLiveBroadcastRoomVo.getSpeakerId())))
+                        .streamName(MessageFormat.format("{0}_{1}", imLiveBroadcastRoomVo.getRoomUid(), String.valueOf(imLiveBroadcastRoomVo.getSpeakerId())))
                         .sessionId(rtcRoom.getSessionId())
                         .config(RTCRequest.RecordConfig.builder()
                                 .videoResolution(videoResolution)

+ 9 - 2
mec-im/src/main/java/com/ym/controller/UserController.java

@@ -8,6 +8,7 @@ import com.ym.mec.biz.dal.dto.TencentImCallbackResult;
 import com.ym.mec.biz.dal.enums.ETencentImCallbackCommand;
 import com.ym.mec.biz.service.ImLiveBroadcastRoomService;
 import com.ym.mec.common.entity.ImUserState;
+import com.ym.service.LiveRoomService;
 import com.ym.service.UserService;
 import io.rong.models.user.UserModel;
 import io.swagger.annotations.ApiOperation;
@@ -27,6 +28,8 @@ public class UserController {
     private UserService userService;
     @Autowired
     private ImLiveBroadcastRoomService imLiveBroadcastRoomService;
+    @Autowired
+    private LiveRoomService liveRoomService;
 
     @RequestMapping(value = "/register", method = RequestMethod.POST)
     public Object register(@RequestBody UserModel userModel) throws Exception {
@@ -103,12 +106,16 @@ public class UserController {
 
         TencentData.CallbackStreamStateEvent event = TencentData.CallbackStreamStateEvent.from(body);
 
+        // 断流事件通知
         if (event.getEventType() == 0) {
-            // 断流事件通知
+            // 自动关闭录制
+            liveRoomService.stopTencentLiveVideoRecord(event.getStreamId());
         }
 
+        // 推流事件通知
         if (event.getEventType() == 1) {
-            // 推流事件通知
+            // 自动开启录制
+            liveRoomService.strartTencentLiveVideoRecord(event.getStreamId());
         }
 
         return TencentData.StreamEventCallbackResult.builder().code(0).build();

+ 85 - 1
mec-im/src/main/java/com/ym/service/Impl/LiveRoomServiceImpl.java

@@ -1,7 +1,12 @@
 package com.ym.service.Impl;
 
+import com.alibaba.fastjson.JSON;
 import com.alibaba.fastjson.JSONObject;
 import com.baomidou.mybatisplus.core.conditions.query.QueryWrapper;
+import com.microsvc.toolkit.middleware.live.LivePluginContext;
+import com.microsvc.toolkit.middleware.live.impl.TencentCloudLivePlugin;
+import com.microsvc.toolkit.middleware.live.message.RTCRequest;
+import com.microsvc.toolkit.middleware.live.message.RTCRoom;
 import com.ym.http.HttpHelper;
 import com.ym.mec.biz.dal.entity.ImLiveRoomVideo;
 import com.ym.mec.biz.service.ImLiveRoomVideoService;
@@ -9,7 +14,6 @@ import com.ym.mec.common.entity.ImRoomMessage;
 import com.ym.mec.common.exception.BizException;
 import com.ym.mec.im.IMHelper;
 import com.ym.mec.thirdparty.storage.StoragePluginContext;
-import com.ym.mec.thirdparty.storage.provider.KS3StoragePlugin;
 import com.ym.pojo.IMApiResultInfo;
 import com.ym.pojo.IMUserOnlineInfo;
 import com.ym.pojo.RecordConfig;
@@ -17,6 +21,7 @@ import com.ym.pojo.RecordNotify;
 import com.ym.service.LiveRoomService;
 import lombok.extern.slf4j.Slf4j;
 import org.apache.commons.lang.StringUtils;
+import org.joda.time.DateTime;
 import org.redisson.api.RBucket;
 import org.redisson.api.RedissonClient;
 import org.springframework.beans.factory.annotation.Autowired;
@@ -44,6 +49,8 @@ public class LiveRoomServiceImpl implements LiveRoomService {
     private ImLiveRoomVideoService imLiveRoomVideoService;
     @Autowired
     private StoragePluginContext storagePluginContext;
+    @Autowired
+    private LivePluginContext livePluginContext;
 
     /**
      * 创建房间-聊天室
@@ -319,4 +326,81 @@ public class LiveRoomServiceImpl implements LiveRoomService {
         return sessionId;
     }
 
+
+    /**
+     * 创建tencent云直播录制记录
+     *
+     * @param streamId 推流Id
+     */
+    @Override
+    public void strartTencentLiveVideoRecord(String streamId) {
+
+        // 直播间ROOM_UID
+        String roomId = streamId.split("_")[0];
+
+        // 创建直播录制
+        RTCRequest.RecordStart recordStart = RTCRequest.RecordStart.builder()
+                .streamName(streamId)
+                .extra("")
+                .endTime(DateTime.now().plusHours(23).getMillis())
+                .build();
+        // 创建录制任务失败,重试3次后,发送IM消息通知主播老师
+        int maxRetry = 0;
+        // 录制任务ID
+        String taskId = "";
+        do {
+            try {
+
+                // 创建录制任务
+                RTCRoom.RecordResp resp = livePluginContext.getPluginService(TencentCloudLivePlugin.PLUGIN_NAME)
+                        .rtcRoomRecordStart(recordStart);
+
+                taskId = resp.getRecordId();
+                if (StringUtils.isNotBlank(taskId)) {
+                    maxRetry = 3;
+                }
+                log.info("createTencentLiveRoomVideoRecord resp={}", JSON.toJSONString(resp));
+            } catch (Exception e) {
+                log.error("创建直播录制失败", e);
+            }
+        } while (maxRetry++ < 3);
+
+        // 生成录制记录
+        ImLiveRoomVideo video = imLiveRoomVideoService.getOne(new QueryWrapper<ImLiveRoomVideo>()
+                .eq("room_uid_", roomId)
+                .eq("record_id_", taskId)
+                .eq("type", 0));
+        if (Objects.nonNull(video)) {
+            return;
+        }
+        imLiveRoomVideoService.save(initImLiveRoomVideo(roomId, taskId, new Date()));
+    }
+
+    /**
+     * 关闭tencent云直播录制记录
+     *
+     * @param streamId 推流Id
+     */
+    @Override
+    public void stopTencentLiveVideoRecord(String streamId) {
+
+        // 关闭录制任务失败,重试3次后,发送IM消息通知主播老师
+        int maxRetry = 0;
+        do {
+            try {
+
+                // 关闭直播录制
+                RTCRoom.RecordResp ret = livePluginContext.getPluginService(TencentCloudLivePlugin.PLUGIN_NAME)
+                        .rtcRoomRecordStop(streamId);
+
+                if (StringUtils.isNotBlank(ret.getRequestId())) {
+                    // 重试最大次数
+                    maxRetry = 3;
+                }
+            } catch (Exception e) {
+                log.error("关闭直播录制失败", e);
+            }
+        } while (maxRetry++ < 3);
+
+    }
 }

+ 12 - 0
mec-im/src/main/java/com/ym/service/LiveRoomService.java

@@ -62,4 +62,16 @@ public interface LiveRoomService {
      * @param userId  用户id
      */
     boolean removeUserUnableSpeak(String roomUid, String userId);
+
+    /**
+     * 开始tencent云直播录制记录
+     * @param streamId 推流Id
+     */
+    void strartTencentLiveVideoRecord(String streamId);
+
+    /**
+     * 关闭tencent云直播录制记录
+     * @param streamId 推流Id
+     */
+    void stopTencentLiveVideoRecord(String streamId);
 }