Browse Source

修改:增加回放视频相关信息记录

hgw 3 years ago
parent
commit
3eee41e261

+ 20 - 0
mec-biz/src/main/java/com/ym/mec/biz/dal/dao/ImLiveRoomVideoDao.java

@@ -0,0 +1,20 @@
+package com.ym.mec.biz.dal.dao;
+
+import com.baomidou.mybatisplus.core.mapper.BaseMapper;
+import com.ym.mec.biz.dal.entity.ImLiveRoomVideo;
+import org.apache.ibatis.annotations.Param;
+
+import java.util.List;
+
+/**
+ * 直播视频记录(ImLiveRoomVideo)表数据库访问层
+ *
+ * @author hgw
+ * @since 2022-03-07 19:06:54
+ */
+public interface ImLiveRoomVideoDao extends BaseMapper<ImLiveRoomVideo> {
+
+    int insertBatch(@Param("entities") List<ImLiveRoomVideo> entities);
+
+}
+

+ 121 - 0
mec-biz/src/main/java/com/ym/mec/biz/dal/entity/ImLiveRoomVideo.java

@@ -0,0 +1,121 @@
+package com.ym.mec.biz.dal.entity;
+
+
+import java.util.Date;
+
+import com.baomidou.mybatisplus.annotation.IdType;
+import com.baomidou.mybatisplus.annotation.TableField;
+import io.swagger.annotations.ApiModel;
+import io.swagger.annotations.ApiModelProperty;
+import com.baomidou.mybatisplus.annotation.TableId;
+
+import java.io.Serializable;
+
+/**
+ * 直播视频记录(ImLiveRoomVideo)表实体类
+ *
+ * @author hgw
+ * @since 2022-03-07 19:06:54
+ */
+@ApiModel(value = "im_live_room_video-直播视频记录")
+public class ImLiveRoomVideo implements Serializable {
+    @TableId(value = "id_", type = IdType.AUTO)
+    @ApiModelProperty(value = "主键")
+    private Integer id;
+
+    @TableField("room_uid_")
+    @ApiModelProperty(value = "房间编号")
+    private String roomUid;
+
+    @TableField("record_id_")
+    @ApiModelProperty(value = "融云直播视频id")
+    private String recordId;
+
+    @TableField("url_")
+    @ApiModelProperty(value = "直播视频地址")
+    private String url;
+
+    @TableField("start_time_")
+    @ApiModelProperty(value = "视频开始时间")
+    private Date startTime;
+
+    @TableField("end_time_")
+    @ApiModelProperty(value = "视频结束时间")
+    private Date endTime;
+
+    @TableField("type")
+    @ApiModelProperty(value = "录制状态 0开始录制  1录制结束 2融云回调完成")
+    private Integer type;
+
+    @TableField("created_time_")
+    @ApiModelProperty(value = "创建时间")
+    private Date createdTime;
+
+    private static final long serialVersionUID = 1L;
+
+    public Integer getId() {
+        return id;
+    }
+
+    public void setId(Integer id) {
+        this.id = id;
+    }
+
+    public String getRoomUid() {
+        return roomUid;
+    }
+
+    public void setRoomUid(String roomUid) {
+        this.roomUid = roomUid;
+    }
+
+    public String getRecordId() {
+        return recordId;
+    }
+
+    public void setRecordId(String recordId) {
+        this.recordId = recordId;
+    }
+
+    public String getUrl() {
+        return url;
+    }
+
+    public void setUrl(String url) {
+        this.url = url;
+    }
+
+    public Date getStartTime() {
+        return startTime;
+    }
+
+    public void setStartTime(Date startTime) {
+        this.startTime = startTime;
+    }
+
+    public Date getEndTime() {
+        return endTime;
+    }
+
+    public void setEndTime(Date endTime) {
+        this.endTime = endTime;
+    }
+
+    public Integer getType() {
+        return type;
+    }
+
+    public void setType(Integer type) {
+        this.type = type;
+    }
+
+    public Date getCreatedTime() {
+        return createdTime;
+    }
+
+    public void setCreatedTime(Date createdTime) {
+        this.createdTime = createdTime;
+    }
+
+}
+

+ 12 - 0
mec-biz/src/main/java/com/ym/mec/biz/dal/vo/ImLiveBroadcastRoomDetailVo.java

@@ -1,8 +1,10 @@
 package com.ym.mec.biz.dal.vo;
 
+import com.ym.mec.biz.dal.entity.ImLiveRoomVideo;
 import io.swagger.annotations.ApiModelProperty;
 
 import java.io.Serializable;
+import java.util.List;
 
 /**
  * @author hgw
@@ -31,6 +33,8 @@ public class ImLiveBroadcastRoomDetailVo implements Serializable {
     @ApiModelProperty(value = "直播时长")
     private Integer totalLiveTime;
 
+    private List<ImLiveRoomVideo> videoList;
+
     public String getRoomUid() {
         return roomUid;
     }
@@ -86,4 +90,12 @@ public class ImLiveBroadcastRoomDetailVo implements Serializable {
     public void setTotalLiveTime(Integer totalLiveTime) {
         this.totalLiveTime = totalLiveTime;
     }
+
+    public List<ImLiveRoomVideo> getVideoList() {
+        return videoList;
+    }
+
+    public void setVideoList(List<ImLiveRoomVideo> videoList) {
+        this.videoList = videoList;
+    }
 }

+ 21 - 0
mec-biz/src/main/java/com/ym/mec/biz/service/ImLiveRoomVideoService.java

@@ -0,0 +1,21 @@
+package com.ym.mec.biz.service;
+
+import com.baomidou.mybatisplus.extension.service.IService;
+import com.ym.mec.biz.dal.dao.ImLiveRoomVideoDao;
+import com.ym.mec.biz.dal.entity.ImLiveRoomVideo;
+
+import java.util.List;
+
+/**
+ * 直播视频记录(ImLiveRoomVideo)表服务接口
+ *
+ * @author hgw
+ * @since 2022-03-07 19:06:55
+ */
+public interface ImLiveRoomVideoService extends IService<ImLiveRoomVideo> {
+
+    ImLiveRoomVideoDao getDao();
+
+    List<ImLiveRoomVideo> queryList(String roomUid);
+}
+

+ 7 - 1
mec-biz/src/main/java/com/ym/mec/biz/service/impl/ImLiveBroadcastRoomMemberServiceImpl.java

@@ -8,6 +8,7 @@ import com.ym.mec.biz.dal.vo.ImLiveBroadcastRoomDetailVo;
 import com.ym.mec.biz.dal.vo.ImLiveBroadcastRoomMemberVo;
 import com.ym.mec.biz.service.ImLiveBroadcastRoomDataService;
 import com.ym.mec.biz.service.ImLiveBroadcastRoomMemberService;
+import com.ym.mec.biz.service.ImLiveRoomVideoService;
 import com.ym.mec.common.page.PageInfo;
 import com.ym.mec.common.page.PageUtil;
 import com.ym.mec.common.page.WrapperUtil;
@@ -31,6 +32,9 @@ public class ImLiveBroadcastRoomMemberServiceImpl extends ServiceImpl<ImLiveBroa
 
     @Autowired
     private ImLiveBroadcastRoomDataService imLiveBroadcastRoomDataService;
+@Autowired
+private ImLiveRoomVideoService imLiveRoomVideoService;
+
 
     @Override
     public ImLiveBroadcastRoomMemberDao getDao() {
@@ -43,7 +47,9 @@ public class ImLiveBroadcastRoomMemberServiceImpl extends ServiceImpl<ImLiveBroa
     @Override
     public ImLiveBroadcastRoomDetailVo queryRoomDetail(Map<String, Object> param) {
         String roomUid = WrapperUtil.toStr(param, "roomUid", "请传入房间编号");
-        return imLiveBroadcastRoomDataService.getDao().queryByRoomUid(roomUid);
+        ImLiveBroadcastRoomDetailVo vo = imLiveBroadcastRoomDataService.getDao().queryByRoomUid(roomUid);
+        vo.setVideoList(imLiveRoomVideoService.queryList(roomUid));
+        return vo;
     }
 
     @Override

+ 56 - 36
mec-biz/src/main/java/com/ym/mec/biz/service/impl/ImLiveBroadcastRoomServiceImpl.java

@@ -42,7 +42,6 @@ import org.springframework.stereotype.Service;
 
 import java.io.Serializable;
 import java.util.*;
-import java.util.function.Consumer;
 import java.util.stream.Collectors;
 
 /**
@@ -220,41 +219,50 @@ public class ImLiveBroadcastRoomServiceImpl extends ServiceImpl<ImLiveBroadcastR
             return;
         }
         Date now = new Date();
+        //查询房间过期时间
+        String expiredMinuteStr = sysConfigDao.findConfigValue("destroy_expired_live_room_minute");
+        if (StringUtils.isEmpty(expiredMinuteStr)) {
+            log.info("roomDestroy>>>> 未查询到配置:destroy_expired_live_room_minute");
+            return;
+        }
+        int expiredMinute = Integer.parseInt(expiredMinuteStr);
         list.forEach(room -> {
-            //过期时间= 房间正式开始时间+30分钟
-            Date expiredTime = DateUtil.addMinutes(room.getCreatedTime(), 30);
-            // 现在 大于等于 过期时间
-            if (now.getTime() >= expiredTime.getTime()) {
-                //获取直播间主讲人信息
-                RBucket<RoomSpeakerInfo> speakerCache = redissonClient.getBucket(LIVE_SPEAKER_INFO.replace(USER_ID, room.getSpeakerId().toString()));
-                if (speakerCache.isExists()) {
-                    RoomSpeakerInfo speakerInfo = speakerCache.get();
-                    //超过30分钟,没有进入房间
-                    if (Objects.isNull(speakerInfo.getJoinRoomTime())) {
-                        roomDestroy(room.getId());
-                    }
-                    //超过30分钟,但是未开启直播,则销毁
-                    if (Objects.isNull(speakerInfo.getState())) {
+            try {
+                destroyExpiredLiveRoom(now, room, expiredMinute);
+            } catch (Exception e) {
+                log.error("roomDestroy>>>> failed roomId:{} msg:{}", room.getId(), e.getMessage());
+            }
+        });
+    }
+
+    private void destroyExpiredLiveRoom(Date now, ImLiveBroadcastRoom room, int expiredMinute) {
+        //过期时间= 房间正式开始时间+expiredMinute 分钟
+        Date expiredTime = DateUtil.addMinutes(room.getCreatedTime(), expiredMinute);
+        // 现在 大于等于 过期时间
+        if (now.getTime() >= expiredTime.getTime()) {
+            //获取直播间主讲人信息
+            RBucket<RoomSpeakerInfo> speakerCache = redissonClient.getBucket(LIVE_SPEAKER_INFO.replace(USER_ID, room.getSpeakerId().toString()));
+            if (speakerCache.isExists()) {
+                RoomSpeakerInfo speakerInfo = speakerCache.get();
+                //超过30分钟,没有进入房间
+                if (Objects.isNull(speakerInfo.getJoinRoomTime())) {
+                    roomDestroy(room.getId());
+                }
+
+                //超过expiredMinute分钟,但是未开启直播,则销毁
+                if (Objects.isNull(speakerInfo.getState())) {
+                    roomDestroy(room.getId());
+                }
+
+                //现在时间 大于 (退出房间的时间 + expiredMinute 分钟),则销毁
+                if (Objects.nonNull(speakerInfo.getExitRoomTime())) {
+                    Date comparedTime = DateUtil.addMinutes(speakerInfo.getExitRoomTime(), expiredMinute);
+                    if (now.getTime() >= comparedTime.getTime()) {
                         roomDestroy(room.getId());
                     }
-                    //现在 大于 (传入时间+30分钟) 则销毁
-                    Consumer<Date> consumer = date -> {
-                        Date comparedTime = DateUtil.addMinutes(date, 30);
-                        if (now.getTime() >= comparedTime.getTime()) {
-                            roomDestroy(room.getId());
-                        }
-                    };
-                    //如果直播状态=1(关闭直播),并且现在 大于等于 结束直播时间 +30分钟,则销毁
-                    if (speakerInfo.getState() == 1) {
-                        consumer.accept(speakerInfo.getEndLiveTime());
-                    }
-                    //现在 大于等于 退出时间 +30分钟,则销毁
-                    if (Objects.nonNull(speakerInfo.getExitRoomTime())) {
-                        consumer.accept(speakerInfo.getExitRoomTime());
-                    }
                 }
             }
-        });
+        }
     }
 
     /**
@@ -278,7 +286,7 @@ public class ImLiveBroadcastRoomServiceImpl extends ServiceImpl<ImLiveBroadcastR
         try {
             imFeignService.destroyLiveRoom(roomUid);
         } catch (Exception e) {
-            log.error(e.getMessage(), e.getCause());
+            log.error("roomDestroy>>>> errorMsg{}", e.getMessage(), e.getCause());
             throw new BizException(e.getMessage());
         }
 
@@ -300,7 +308,11 @@ public class ImLiveBroadcastRoomServiceImpl extends ServiceImpl<ImLiveBroadcastR
         message.setFromUserId(speakerId.toString());
         message.setToChatroomId(roomUid);
         message.setObjectName(ImRoomMessage.FORCED_OFFLINE);
-        imFeignService.publishRoomMsg(message);
+        try {
+            imFeignService.publishRoomMsg(message);
+        } catch (Exception e) {
+            log.error("roomDestroy>>>> publishRoomErrorMsg{}", e.getMessage(), e.getCause());
+        }
         log.info("roomDestroy>>>> FORCED_OFFLINE {}", JSONObject.toJSONString(message));
     }
 
@@ -324,7 +336,7 @@ public class ImLiveBroadcastRoomServiceImpl extends ServiceImpl<ImLiveBroadcastR
             });
             if (CollectionUtils.isNotEmpty(memberList)) {
                 liveBroadcastRoomMemberService.getDao().insertBatch(memberList);
-                totalLookNum = memberList.size();
+                totalLookNum = roomTotalUser.size();
             }
             //删除用户对应的直播间关系缓存
             roomTotalUser.stream()
@@ -511,7 +523,11 @@ public class ImLiveBroadcastRoomServiceImpl extends ServiceImpl<ImLiveBroadcastR
         RoomSpeakerInfo roomSpeakerInfo = speakerCache.get();
         if (Objects.nonNull(roomSpeakerInfo.getWhetherVideo()) && roomSpeakerInfo.getWhetherVideo() == 0) {
             //开始录制视频
-            imFeignService.startRecord(roomUid);
+            try {
+                imFeignService.startRecord(roomUid);
+            } catch (Exception e) {
+                log.error("startRecord error: {}", e.getMessage());
+            }
         }
         //开始直播
         roomSpeakerInfo.setState(0);
@@ -539,7 +555,11 @@ public class ImLiveBroadcastRoomServiceImpl extends ServiceImpl<ImLiveBroadcastR
         if (Objects.nonNull(roomSpeakerInfo.getWhetherVideo()) && roomSpeakerInfo.getWhetherVideo() == 0
                 && stateFlag) {
             //停止录制视频
-            imFeignService.stopRecord(roomSpeakerInfo.getRoomUid());
+            try {
+                imFeignService.stopRecord(roomSpeakerInfo.getRoomUid());
+            } catch (Exception e) {
+                log.error("stopRecord error: {}", e.getMessage());
+            }
         }
         if (stateFlag) {
             Date now = new Date();

+ 44 - 0
mec-biz/src/main/java/com/ym/mec/biz/service/impl/ImLiveRoomVideoServiceImpl.java

@@ -0,0 +1,44 @@
+package com.ym.mec.biz.service.impl;
+
+import com.baomidou.mybatisplus.core.metadata.IPage;
+import com.baomidou.mybatisplus.extension.plugins.pagination.Page;
+import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl;
+import com.ym.mec.biz.dal.dao.ImLiveRoomVideoDao;
+import com.ym.mec.biz.dal.entity.ImLiveRoomVideo;
+import com.ym.mec.biz.service.ImLiveRoomVideoService;
+import com.ym.mec.common.page.PageInfo;
+import com.ym.mec.common.page.PageUtil;
+import com.ym.mec.common.page.WrapperUtil;
+import org.slf4j.Logger;
+import org.slf4j.LoggerFactory;
+import org.springframework.stereotype.Service;
+
+import java.util.List;
+import java.util.Map;
+
+/**
+ * 直播视频记录(ImLiveRoomVideo)表服务实现类
+ *
+ * @author hgw
+ * @since 2022-03-07 19:06:55
+ */
+@Service("imLiveRoomVideoService")
+public class ImLiveRoomVideoServiceImpl extends ServiceImpl<ImLiveRoomVideoDao, ImLiveRoomVideo> implements ImLiveRoomVideoService {
+
+    private final static Logger log = LoggerFactory.getLogger(ImLiveRoomVideoServiceImpl.class);
+
+    @Override
+    public ImLiveRoomVideoDao getDao() {
+        return this.baseMapper;
+    }
+
+    public List<ImLiveRoomVideo> queryList(String roomUid) {
+        return baseMapper.selectList(new WrapperUtil<ImLiveRoomVideo>()
+                .hasEq("room_uid_",roomUid)
+                .hasEq("type",2).queryWrapper()
+        );
+    }
+
+
+}
+

+ 31 - 0
mec-biz/src/main/resources/config/mybatis/ImLiveRoomVideoMapper.xml

@@ -0,0 +1,31 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<!DOCTYPE mapper PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN" "http://mybatis.org/dtd/mybatis-3-mapper.dtd">
+<mapper namespace="com.ym.mec.biz.dal.dao.ImLiveRoomVideoDao">
+    <resultMap id="BaseResultMap" type="com.ym.mec.biz.dal.entity.ImLiveRoomVideo">
+        <id column="id_" jdbcType="INTEGER" property="id"/>
+        <result column="room_uid_" jdbcType="VARCHAR" property="roomUid"/>
+        <result column="record_id_" jdbcType="VARCHAR" property="recordId"/>
+        <result column="url_" jdbcType="VARCHAR" property="url"/>
+        <result column="start_time_" jdbcType="TIMESTAMP" property="startTime"/>
+        <result column="end_time_" jdbcType="TIMESTAMP" property="endTime"/>
+        <result column="type" jdbcType="INTEGER" property="type"/>
+        <result column="created_time_" jdbcType="TIMESTAMP" property="createdTime"/>
+    </resultMap>
+
+    <sql id="Base_Column_List">
+        id_
+        , room_uid_, record_id_, url_, start_time_, end_time_, type, created_time_
+    </sql>
+
+    <insert id="insertBatch" keyColumn="id_" keyProperty="id" useGeneratedKeys="true"
+            parameterType="com.ym.mec.biz.dal.entity.ImLiveRoomVideo">
+        insert into im_live_room_video(room_uid_, record_id_, url_, start_time_, end_time_, type,
+        created_time_)
+        values
+        <foreach collection="entities" item="entity" separator=",">
+            (#{entity.roomUid}, #{entity.recordId}, #{entity.url}, #{entity.startTime},
+            #{entity.endTime}, #{entity.type}, #{entity.createdTime})
+        </foreach>
+    </insert>
+
+</mapper>

+ 47 - 7
mec-im/src/main/java/com/ym/service/Impl/LiveRoomServiceImpl.java

@@ -1,8 +1,10 @@
 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.ym.http.HttpHelper;
+import com.ym.mec.biz.dal.entity.ImLiveRoomVideo;
+import com.ym.mec.biz.service.ImLiveRoomVideoService;
 import com.ym.mec.common.entity.ImRoomMessage;
 import com.ym.mec.common.exception.BizException;
 import com.ym.mec.im.IMHelper;
@@ -19,7 +21,9 @@ import org.springframework.stereotype.Service;
 
 import java.net.HttpURLConnection;
 import java.util.ArrayList;
+import java.util.Date;
 import java.util.List;
+import java.util.Objects;
 
 /**
  * @author hgw
@@ -35,6 +39,8 @@ public class LiveRoomServiceImpl implements LiveRoomService {
     private HttpHelper httpHelper;
     @Autowired
     private RedissonClient redissonClient;
+    @Autowired
+    private ImLiveRoomVideoService imLiveRoomVideoService;
 
     /**
      * 创建房间-聊天室
@@ -110,10 +116,28 @@ public class LiveRoomServiceImpl implements LiveRoomService {
         String body = paramJson.toJSONString();
         HttpURLConnection conn = httpHelper.createIMRtcPostHttpConnection("/rtc/record/start.json", "application/json", roomId);
         httpHelper.setBodyParameter(body, conn);
-        IMApiResultInfo resultInfo = JSON.parseObject(httpHelper.returnResult(conn, body), IMApiResultInfo.class);
-        if (resultInfo.getCode() != 200) {
-            log.error("直播视频录制失败:resultInfo : {} ", resultInfo);
+        String returnResult = httpHelper.returnResult(conn, body);
+        JSONObject resultObject = JSONObject.parseObject(returnResult);
+        String code = resultObject.getString("code");
+        if (!"200".equals(code)) {
+            log.error("直播视频录制失败:resultInfo : {} ", returnResult);
+        }
+        String recordId = resultObject.getString("recordId");
+        ImLiveRoomVideo video = imLiveRoomVideoService.getOne(new QueryWrapper<ImLiveRoomVideo>()
+                .eq("room_uid_", roomId)
+                .eq("record_id_", recordId)
+                .eq("type", 0));
+        if (Objects.nonNull(video)) {
+            return;
+        } else {
+            video = new ImLiveRoomVideo();
         }
+        video.setRoomUid(roomId);
+        video.setRecordId(recordId);
+        video.setStartTime(new Date());
+        video.setType(0);
+        video.setCreatedTime(new Date());
+        imLiveRoomVideoService.save(video);
     }
 
     @Override
@@ -130,11 +154,27 @@ public class LiveRoomServiceImpl implements LiveRoomService {
     @Override
     public void recordSync(RecordNotify recordNotify) {
         if (recordNotify.getCode().equals(200)) {
-            if (recordNotify.getType() != null && recordNotify.getType() == 4) {
-                // TODO 云端录制文件地址
+            if (Objects.nonNull(recordNotify.getType()) && recordNotify.getType() == 4) {
+                //云端录制文件地址
                 String fileUrl = recordNotify.getOutput().getFileUrl();
                 String roomId = recordNotify.getRoomId();
-
+                //写入数据库
+                try {
+                    ImLiveRoomVideo video = imLiveRoomVideoService.getOne(new QueryWrapper<ImLiveRoomVideo>()
+                            .eq("room_uid_", roomId)
+                            .eq("record_id_", recordNotify.getRecordId())
+                            .eq("type", 0));
+                    if (Objects.isNull(video)) {
+                        return;
+                    }
+                    video.setEndTime(new Date());
+                    video.setType(2);
+                    video.setUrl(fileUrl);
+                    video.setCreatedTime(new Date());
+                    imLiveRoomVideoService.updateById(video);
+                } catch (Exception e) {
+                    log.error("recordSync >>>>  error : {}", e.getMessage());
+                }
             }
         }
     }

+ 6 - 0
mec-web/src/main/java/com/ym/mec/web/controller/ImLiveBroadcastRoomController.java

@@ -150,6 +150,12 @@ public class ImLiveBroadcastRoomController extends BaseController {
         return imLiveBroadcastRoomService.test(roomUid, userId);
     }
 
+    @GetMapping("/destroyExpiredLiveRoom")
+    public Object destroyExpiredLiveRoom() {
+        imLiveBroadcastRoomService.destroyExpiredLiveRoom();
+        return succeed();
+    }
+
     @GetMapping("/shareGroup")
     public HttpResponseResult shareGroup(@ApiParam(value = "房间uid", required = true) String roomUid,
                                          @ApiParam(value = "群编号", required = true) String groupIds) {