|
|
@@ -3,11 +3,15 @@ package com.genersoft.iot.vmp.service.impl;
|
|
|
import com.alibaba.fastjson.JSON;
|
|
|
import com.alibaba.fastjson.JSONObject;
|
|
|
import com.alibaba.fastjson.TypeReference;
|
|
|
+import com.genersoft.iot.vmp.common.StreamInfo;
|
|
|
+import com.genersoft.iot.vmp.conf.UserSetup;
|
|
|
import com.genersoft.iot.vmp.gb28181.bean.GbStream;
|
|
|
+import com.genersoft.iot.vmp.media.zlm.ZLMHttpHookSubscribe;
|
|
|
import com.genersoft.iot.vmp.media.zlm.ZLMRESTfulUtils;
|
|
|
import com.genersoft.iot.vmp.media.zlm.ZLMServerConfig;
|
|
|
import com.genersoft.iot.vmp.media.zlm.dto.MediaItem;
|
|
|
import com.genersoft.iot.vmp.media.zlm.dto.MediaServerItem;
|
|
|
+import com.genersoft.iot.vmp.media.zlm.dto.OriginType;
|
|
|
import com.genersoft.iot.vmp.media.zlm.dto.StreamPushItem;
|
|
|
import com.genersoft.iot.vmp.service.IMediaServerService;
|
|
|
import com.genersoft.iot.vmp.service.IStreamPushService;
|
|
|
@@ -20,10 +24,7 @@ import com.github.pagehelper.PageInfo;
|
|
|
import org.springframework.beans.factory.annotation.Autowired;
|
|
|
import org.springframework.stereotype.Service;
|
|
|
|
|
|
-import java.util.ArrayList;
|
|
|
-import java.util.HashMap;
|
|
|
-import java.util.List;
|
|
|
-import java.util.Map;
|
|
|
+import java.util.*;
|
|
|
|
|
|
@Service
|
|
|
public class StreamPushServiceImpl implements IStreamPushService {
|
|
|
@@ -43,6 +44,9 @@ public class StreamPushServiceImpl implements IStreamPushService {
|
|
|
@Autowired
|
|
|
private IRedisCatchStorage redisCatchStorage;
|
|
|
|
|
|
+ @Autowired
|
|
|
+ private UserSetup userSetup;
|
|
|
+
|
|
|
@Autowired
|
|
|
private IMediaServerService mediaServerService;
|
|
|
|
|
|
@@ -56,7 +60,9 @@ public class StreamPushServiceImpl implements IStreamPushService {
|
|
|
for (MediaItem item : mediaItems) {
|
|
|
|
|
|
// 不保存国标推理以及拉流代理的流
|
|
|
- if (item.getOriginType() == 1 || item.getOriginType() == 2 || item.getOriginType() == 8) {
|
|
|
+ if (item.getOriginType() == OriginType.RTSP_PUSH.ordinal()
|
|
|
+ || item.getOriginType() == OriginType.RTMP_PUSH.ordinal()
|
|
|
+ || item.getOriginType() == OriginType.RTC_PUSH.ordinal() ) {
|
|
|
String key = item.getApp() + "_" + item.getStream();
|
|
|
StreamPushItem streamPushItem = result.get(key);
|
|
|
if (streamPushItem == null) {
|
|
|
@@ -97,6 +103,11 @@ public class StreamPushServiceImpl implements IStreamPushService {
|
|
|
return new PageInfo<>(all);
|
|
|
}
|
|
|
|
|
|
+ @Override
|
|
|
+ public List<StreamPushItem> getPushList(String mediaServerId) {
|
|
|
+ return streamPushMapper.selectAllByMediaServerId(mediaServerId);
|
|
|
+ }
|
|
|
+
|
|
|
@Override
|
|
|
public boolean saveToGB(GbStream stream) {
|
|
|
stream.setStreamType("push");
|
|
|
@@ -137,17 +148,84 @@ public class StreamPushServiceImpl implements IStreamPushService {
|
|
|
}
|
|
|
|
|
|
@Override
|
|
|
- public void zlmServerOnline(ZLMServerConfig zlmServerConfig) {
|
|
|
- // 似乎没啥需要做的
|
|
|
+ public void zlmServerOnline(String mediaServerId) {
|
|
|
+ // 同步zlm推流信息
|
|
|
+ MediaServerItem mediaServerItem = mediaServerService.getOne(mediaServerId);
|
|
|
+ if (mediaServerItem == null) {
|
|
|
+ return;
|
|
|
+ }
|
|
|
+ List<StreamPushItem> pushList = getPushList(mediaServerId);
|
|
|
+ if (pushList.size() > 0) {
|
|
|
+ Map<String, StreamPushItem> pushItemMap = new HashMap<>();
|
|
|
+ for (StreamPushItem streamPushItem : pushList) {
|
|
|
+ pushItemMap.put(streamPushItem.getApp() + streamPushItem.getStream(), streamPushItem);
|
|
|
+ }
|
|
|
+ zlmresTfulUtils.getMediaList(mediaServerItem, (mediaList ->{
|
|
|
+ if (mediaList == null) return;
|
|
|
+ String dataStr = mediaList.getString("data");
|
|
|
+
|
|
|
+ Integer code = mediaList.getInteger("code");
|
|
|
+ List<StreamPushItem> streamPushItems = null;
|
|
|
+ if (code == 0 ) {
|
|
|
+ if (dataStr != null) {
|
|
|
+ streamPushItems = handleJSON(dataStr, mediaServerItem);
|
|
|
+ }
|
|
|
+ }
|
|
|
+
|
|
|
+ if (streamPushItems != null) {
|
|
|
+ for (StreamPushItem streamPushItem : streamPushItems) {
|
|
|
+ pushItemMap.remove(streamPushItem.getApp() + streamPushItem.getStream());
|
|
|
+ }
|
|
|
+ }
|
|
|
+ Collection<StreamPushItem> offlinePushItems = pushItemMap.values();
|
|
|
+ if (offlinePushItems.size() > 0) {
|
|
|
+ String type = "PUSH";
|
|
|
+ streamPushMapper.delAll(new ArrayList<>(offlinePushItems));
|
|
|
+ for (StreamPushItem offlinePushItem : offlinePushItems) {
|
|
|
+ JSONObject jsonObject = new JSONObject();
|
|
|
+ jsonObject.put("serverId", userSetup.getServerId());
|
|
|
+ jsonObject.put("app", offlinePushItem.getApp());
|
|
|
+ jsonObject.put("stream", offlinePushItem.getStream());
|
|
|
+ jsonObject.put("register", false);
|
|
|
+ jsonObject.put("mediaServerId", mediaServerId);
|
|
|
+ redisCatchStorage.sendStreamChangeMsg(type, jsonObject);
|
|
|
+ // 移除redis内流的信息
|
|
|
+ redisCatchStorage.removeStream(mediaServerItem.getId(), "PUSH", offlinePushItem.getApp(), offlinePushItem.getStream());
|
|
|
+ }
|
|
|
+ }
|
|
|
+ }));
|
|
|
+ }
|
|
|
}
|
|
|
|
|
|
@Override
|
|
|
public void zlmServerOffline(String mediaServerId) {
|
|
|
- // 移除没有serverId的推流
|
|
|
+ List<StreamPushItem> streamPushItems = streamPushMapper.selectAllByMediaServerId(mediaServerId);
|
|
|
+ // 移除没有GBId的推流
|
|
|
streamPushMapper.deleteWithoutGBId(mediaServerId);
|
|
|
+ gbStreamMapper.deleteWithoutGBId("push", mediaServerId);
|
|
|
// 其他的流设置未启用
|
|
|
gbStreamMapper.updateStatusByMediaServerId(mediaServerId, false);
|
|
|
- // 移除redis内流的信息
|
|
|
- redisCatchStorage.removeStream(mediaServerId, "PUSH");
|
|
|
+ // 发送流停止消息
|
|
|
+ String type = "PUSH";
|
|
|
+ // 发送redis消息
|
|
|
+ List<StreamInfo> streamInfoList = redisCatchStorage.getStreams(mediaServerId, type);
|
|
|
+ if (streamInfoList.size() > 0) {
|
|
|
+ for (StreamInfo streamInfo : streamInfoList) {
|
|
|
+ JSONObject jsonObject = new JSONObject();
|
|
|
+ jsonObject.put("serverId", userSetup.getServerId());
|
|
|
+ jsonObject.put("app", streamInfo.getApp());
|
|
|
+ jsonObject.put("stream", streamInfo.getStreamId());
|
|
|
+ jsonObject.put("register", false);
|
|
|
+ jsonObject.put("mediaServerId", mediaServerId);
|
|
|
+ redisCatchStorage.sendStreamChangeMsg(type, jsonObject);
|
|
|
+ // 移除redis内流的信息
|
|
|
+ redisCatchStorage.removeStream(mediaServerId, type, streamInfo.getApp(), streamInfo.getStreamId());
|
|
|
+ }
|
|
|
+ }
|
|
|
+ }
|
|
|
+
|
|
|
+ @Override
|
|
|
+ public void clean() {
|
|
|
+
|
|
|
}
|
|
|
}
|