|
@@ -16,6 +16,7 @@ import com.microsvc.toolkit.middleware.live.message.LiveRoomMessage;
|
|
import com.microsvc.toolkit.middleware.live.message.LiveRoomUser;
|
|
import com.microsvc.toolkit.middleware.live.message.LiveRoomUser;
|
|
import com.microsvc.toolkit.middleware.live.message.RTCRequest;
|
|
import com.microsvc.toolkit.middleware.live.message.RTCRequest;
|
|
import com.microsvc.toolkit.middleware.live.message.RTCRoom;
|
|
import com.microsvc.toolkit.middleware.live.message.RTCRoom;
|
|
|
|
+import com.microsvc.toolkit.middleware.live.message.TencentWrapper;
|
|
import com.ym.mec.auth.api.client.SysUserFeignService;
|
|
import com.ym.mec.auth.api.client.SysUserFeignService;
|
|
import com.ym.mec.auth.api.entity.SysUser;
|
|
import com.ym.mec.auth.api.entity.SysUser;
|
|
import com.ym.mec.auth.api.enums.SysUserType;
|
|
import com.ym.mec.auth.api.enums.SysUserType;
|
|
@@ -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.ImLiveBroadcastRoomData;
|
|
import com.ym.mec.biz.dal.entity.ImLiveBroadcastRoomMember;
|
|
import com.ym.mec.biz.dal.entity.ImLiveBroadcastRoomMember;
|
|
import com.ym.mec.biz.dal.entity.ImLiveRoomBlack;
|
|
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.enums.MessageTypeEnum;
|
|
import com.ym.mec.biz.dal.page.LiveRoomGoodsOrderQueryInfo;
|
|
import com.ym.mec.biz.dal.page.LiveRoomGoodsOrderQueryInfo;
|
|
import com.ym.mec.biz.dal.vo.*;
|
|
import com.ym.mec.biz.dal.vo.*;
|
|
@@ -107,7 +109,8 @@ public class ImLiveBroadcastRoomServiceImpl extends ServiceImpl<ImLiveBroadcastR
|
|
private ImLiveRoomReservationService imLiveRoomReservationService;
|
|
private ImLiveRoomReservationService imLiveRoomReservationService;
|
|
@Autowired
|
|
@Autowired
|
|
private ImLiveRoomBlackService imLiveRoomBlackService;
|
|
private ImLiveRoomBlackService imLiveRoomBlackService;
|
|
-
|
|
|
|
|
|
+ @Autowired
|
|
|
|
+ private ImLiveRoomVideoService imLiveRoomVideoService;
|
|
@Autowired
|
|
@Autowired
|
|
private LivePluginContext livePluginContext;
|
|
private LivePluginContext livePluginContext;
|
|
|
|
|
|
@@ -285,7 +288,7 @@ public class ImLiveBroadcastRoomServiceImpl extends ServiceImpl<ImLiveBroadcastR
|
|
param.put("clientType", SysUserType.TEACHER.getCode());
|
|
param.put("clientType", SysUserType.TEACHER.getCode());
|
|
}
|
|
}
|
|
Page<ImLiveBroadcastRoomVo> pageInfo = PageUtil.concatTimePage(param, "startTime", "endTime");
|
|
Page<ImLiveBroadcastRoomVo> pageInfo = PageUtil.concatTimePage(param, "startTime", "endTime");
|
|
- pageInfo.setDesc("a.created_time_");
|
|
|
|
|
|
+ // pageInfo.setDesc("a.created_time_");
|
|
param.put("tenantId", TenantContextHolder.getTenantId());
|
|
param.put("tenantId", TenantContextHolder.getTenantId());
|
|
IPage<ImLiveBroadcastRoomVo> page = baseMapper.queryPage(pageInfo, param);
|
|
IPage<ImLiveBroadcastRoomVo> page = baseMapper.queryPage(pageInfo, param);
|
|
|
|
|
|
@@ -658,8 +661,25 @@ public class ImLiveBroadcastRoomServiceImpl extends ServiceImpl<ImLiveBroadcastR
|
|
LivePluginService pluginService = livePluginContext.getPluginService(room.getServiceProvider());
|
|
LivePluginService pluginService = livePluginContext.getPluginService(room.getServiceProvider());
|
|
pluginService.sendChatRoomMessage(message);
|
|
pluginService.sendChatRoomMessage(message);
|
|
log.info("roomDestroy>>>> FORCED_OFFLINE {}", JSONObject.toJSONString(message));
|
|
log.info("roomDestroy>>>> FORCED_OFFLINE {}", JSONObject.toJSONString(message));
|
|
|
|
+
|
|
//销毁直播间
|
|
//销毁直播间
|
|
pluginService.chatRoomDestroy(roomUid);
|
|
pluginService.chatRoomDestroy(roomUid);
|
|
|
|
+
|
|
|
|
+ // 录制任务Id
|
|
|
|
+ if (room.getServiceProvider().equals(TencentCloudLivePlugin.PLUGIN_NAME)) {
|
|
|
|
+
|
|
|
|
+ List<String> collect = imLiveRoomVideoService.lambdaQuery()
|
|
|
|
+ .eq(ImLiveRoomVideo::getRoomUid, roomUid).list().stream()
|
|
|
|
+ .map(ImLiveRoomVideo::getRecordId)
|
|
|
|
+ .filter(StringUtils::isNotEmpty)
|
|
|
|
+ .distinct().collect(Collectors.toList());
|
|
|
|
+
|
|
|
|
+ for (String taskId : collect) {
|
|
|
|
+ // 删除录制任务
|
|
|
|
+ pluginService.rtcRoomRecordStop(taskId);
|
|
|
|
+ }
|
|
|
|
+ }
|
|
|
|
+
|
|
// imFeignService.destroyLiveRoom(roomUid);
|
|
// imFeignService.destroyLiveRoom(roomUid);
|
|
log.info("roomDestroy>>>> destroyLiveRoom {}", JSONObject.toJSONString(message));
|
|
log.info("roomDestroy>>>> destroyLiveRoom {}", JSONObject.toJSONString(message));
|
|
} catch (Exception e) {
|
|
} catch (Exception e) {
|
|
@@ -667,6 +687,10 @@ public class ImLiveBroadcastRoomServiceImpl extends ServiceImpl<ImLiveBroadcastR
|
|
}
|
|
}
|
|
}
|
|
}
|
|
|
|
|
|
|
|
+ private String getStreamId(String roomUid, Integer speakerId) {
|
|
|
|
+ return roomUid + "_" + speakerId;
|
|
|
|
+ }
|
|
|
|
+
|
|
//获取该直播间所有数据写入数据库-并清理缓存
|
|
//获取该直播间所有数据写入数据库-并清理缓存
|
|
private void insertAndCleanLiveData(String roomUid, Integer speakerId) {
|
|
private void insertAndCleanLiveData(String roomUid, Integer speakerId) {
|
|
log.info("insertAndCleanLiveData >>>> roomUid : {}", roomUid);
|
|
log.info("insertAndCleanLiveData >>>> roomUid : {}", roomUid);
|
|
@@ -1311,7 +1335,7 @@ public class ImLiveBroadcastRoomServiceImpl extends ServiceImpl<ImLiveBroadcastR
|
|
RTCRoom.RecordResp recordResp = pluginService.rtcRoomRecordStart(RTCRequest.RecordStart.builder()
|
|
RTCRoom.RecordResp recordResp = pluginService.rtcRoomRecordStart(RTCRequest.RecordStart.builder()
|
|
.startTime(dateTime.plusMillis(5).getMillis() / 1000)
|
|
.startTime(dateTime.plusMillis(5).getMillis() / 1000)
|
|
.endTime(dateTime.plusDays(1).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())
|
|
.sessionId(rtcRoom.getSessionId())
|
|
.config(RTCRequest.RecordConfig.builder()
|
|
.config(RTCRequest.RecordConfig.builder()
|
|
.videoResolution(videoResolution)
|
|
.videoResolution(videoResolution)
|
|
@@ -1496,6 +1520,22 @@ public class ImLiveBroadcastRoomServiceImpl extends ServiceImpl<ImLiveBroadcastR
|
|
// 创建直播间IM群
|
|
// 创建直播间IM群
|
|
pluginService.chatRoomCreate(room.getRoomUid(), room.getRoomTitle(),sysUser.getId().toString());
|
|
pluginService.chatRoomCreate(room.getRoomUid(), room.getRoomTitle(),sysUser.getId().toString());
|
|
|
|
|
|
|
|
+ // 腾讯云直播,提前生成录制规则
|
|
|
|
+ if (room.getServiceProvider().equals(TencentCloudLivePlugin.PLUGIN_NAME)) {
|
|
|
|
+
|
|
|
|
+ DateTime now = DateTime.now();
|
|
|
|
+
|
|
|
|
+ RTCRequest.RecordStart recordStart = RTCRequest.RecordStart.builder()
|
|
|
|
+ .streamName(MessageFormat.format("{0}_{1}", room.getRoomUid(), room.getSpeakerId().toString()))
|
|
|
|
+ .extra("")
|
|
|
|
+ .startTime(now.toDateTime().getMillis())
|
|
|
|
+ .endTime(now.plusDays(1).toDateTime().getMillis())
|
|
|
|
+ .build();
|
|
|
|
+
|
|
|
|
+ // 生成录制任务
|
|
|
|
+ pluginService.rtcRoomRecordStart(recordStart);
|
|
|
|
+ }
|
|
|
|
+
|
|
// imFeignService.createLiveRoom(room.getRoomUid(), room.getRoomTitle());
|
|
// imFeignService.createLiveRoom(room.getRoomUid(), room.getRoomTitle());
|
|
//推送预约直播间消息
|
|
//推送预约直播间消息
|
|
imLiveRoomReservationService.push(room);
|
|
imLiveRoomReservationService.push(room);
|
|
@@ -1714,7 +1754,7 @@ public class ImLiveBroadcastRoomServiceImpl extends ServiceImpl<ImLiveBroadcastR
|
|
sysMessageService.batchSendImGroupMessage(MessageTypeEnum.IM_SHARE_LIVE_URL, sysUser.getId().toString(), "liveRoom?" + roomUid, groupIds.split(","), null,
|
|
sysMessageService.batchSendImGroupMessage(MessageTypeEnum.IM_SHARE_LIVE_URL, sysUser.getId().toString(), "liveRoom?" + roomUid, groupIds.split(","), null,
|
|
imLiveBroadcastRoomVo.getTenantName(), imLiveBroadcastRoomVo.getRoomTitle(), imLiveBroadcastRoomVo.getSpeakerName(),
|
|
imLiveBroadcastRoomVo.getTenantName(), imLiveBroadcastRoomVo.getRoomTitle(), imLiveBroadcastRoomVo.getSpeakerName(),
|
|
DateUtil.format(imLiveBroadcastRoomVo.getLiveStartTime(), DateUtil.CHINESE_DATA_FORMAT_1),
|
|
DateUtil.format(imLiveBroadcastRoomVo.getLiveStartTime(), DateUtil.CHINESE_DATA_FORMAT_1),
|
|
- imLiveBroadcastRoomVo.getLiveRemark(), HttpUtil.getSortUrl(baseApiUrl + "/#/liveClassTransfer?roomUid=" + roomUid));
|
|
|
|
|
|
+ imLiveBroadcastRoomVo.getLiveRemark(), baseApiUrl + "/#/liveClassTransfer?roomUid=" + roomUid);
|
|
}
|
|
}
|
|
|
|
|
|
/**
|
|
/**
|
|
@@ -1987,6 +2027,38 @@ public class ImLiveBroadcastRoomServiceImpl extends ServiceImpl<ImLiveBroadcastR
|
|
liveBroadcastRoomMemberDao.updateLiveRoomStatus(userIds, callbackAfterNewMemberJoin.getGroupId(),liveRoomStatus);
|
|
liveBroadcastRoomMemberDao.updateLiveRoomStatus(userIds, callbackAfterNewMemberJoin.getGroupId(),liveRoomStatus);
|
|
}
|
|
}
|
|
|
|
|
|
|
|
+ @Override
|
|
|
|
+ public void destroyLiveRoom() {
|
|
|
|
+ //查询状态是 未开始和已开始 的直播间
|
|
|
|
+ List<ImLiveBroadcastRoom> list = this.list(Wrappers.<ImLiveBroadcastRoom>lambdaQuery()
|
|
|
|
+ .in(ImLiveBroadcastRoom::getLiveState, 1)
|
|
|
|
+ .eq(ImLiveBroadcastRoom::getRoomState, 0));
|
|
|
|
+ if (CollectionUtils.isEmpty(list)) {
|
|
|
|
+ return;
|
|
|
|
+ }
|
|
|
|
+ for (ImLiveBroadcastRoom imLiveBroadcastRoom : list) {
|
|
|
|
+
|
|
|
|
+ LivePluginService pluginService = livePluginContext.getPluginService(
|
|
|
|
+ imLiveBroadcastRoom.getServiceProvider());
|
|
|
|
+ try {
|
|
|
|
+ TencentWrapper.LiveStreamState liveStreamState = pluginService
|
|
|
|
+ .liveStreamState(getStreamId(imLiveBroadcastRoom.getRoomUid(),imLiveBroadcastRoom.getSpeakerId()));
|
|
|
|
+ if (liveStreamState == null) {
|
|
|
|
+ log.error("查询直播间流失败,返回结果为空");
|
|
|
|
+ continue;
|
|
|
|
+ }
|
|
|
|
+ log.info("查询直播间流状态:{},roomUid:{}", JSON.toJSONString(liveStreamState), imLiveBroadcastRoom.getRoomUid());
|
|
|
|
+ if (!"active".equals(liveStreamState.getStreamState())) {
|
|
|
|
+ roomDestroy(imLiveBroadcastRoom.getRoomUid());
|
|
|
|
+ }
|
|
|
|
+ } catch (Exception e) {
|
|
|
|
+
|
|
|
|
+ log.error("查询直播间流失败", e);
|
|
|
|
+ }
|
|
|
|
+
|
|
|
|
+ }
|
|
|
|
+ }
|
|
|
|
+
|
|
|
|
|
|
/**
|
|
/**
|
|
* 查询直播间所有用户信息
|
|
* 查询直播间所有用户信息
|