Commit f61051c46361c4863faf73db81062de0889900d4

Authored by 648540858
1 parent 0eee65bc

优化streamchannge hook以及对推流的识别

src/main/java/com/genersoft/iot/vmp/common/StreamInfo.java
... ... @@ -30,7 +30,7 @@ public class StreamInfo {
30 30 private String rtsps;
31 31 private String rtc;
32 32 private String mediaServerId;
33   - private JSONArray tracks;
  33 + private Object tracks;
34 34  
35 35 public static class TransactionInfo{
36 36 public String callId;
... ... @@ -105,11 +105,11 @@ public class StreamInfo {
105 105 this.rtsp = rtsp;
106 106 }
107 107  
108   - public JSONArray getTracks() {
  108 + public Object getTracks() {
109 109 return tracks;
110 110 }
111 111  
112   - public void setTracks(JSONArray tracks) {
  112 + public void setTracks(Object tracks) {
113 113 this.tracks = tracks;
114 114 }
115 115  
... ...
src/main/java/com/genersoft/iot/vmp/media/zlm/ZLMHttpHookListener.java
... ... @@ -3,11 +3,13 @@ package com.genersoft.iot.vmp.media.zlm;
3 3 import java.util.List;
4 4 import java.util.UUID;
5 5  
  6 +import com.alibaba.fastjson.JSON;
6 7 import com.alibaba.fastjson.JSONArray;
7 8 import com.genersoft.iot.vmp.common.StreamInfo;
8 9 import com.genersoft.iot.vmp.conf.MediaConfig;
9 10 import com.genersoft.iot.vmp.conf.UserSetup;
10 11 import com.genersoft.iot.vmp.gb28181.bean.Device;
  12 +import com.genersoft.iot.vmp.media.zlm.dto.MediaItem;
11 13 import com.genersoft.iot.vmp.media.zlm.dto.MediaServerItem;
12 14 import com.genersoft.iot.vmp.service.IMediaServerService;
13 15 import com.genersoft.iot.vmp.service.IMediaService;
... ... @@ -258,12 +260,13 @@ public class ZLMHttpHookListener {
258 260 */
259 261 @ResponseBody
260 262 @PostMapping(value = "/on_stream_changed", produces = "application/json;charset=UTF-8")
261   - public ResponseEntity<String> onStreamChanged(@RequestBody JSONObject json){
  263 + public ResponseEntity<String> onStreamChanged(@RequestBody MediaItem item){
262 264  
263 265 if (logger.isDebugEnabled()) {
264   - logger.debug("ZLM HOOK on_stream_changed API调用,参数:" + json.toString());
  266 + logger.debug("ZLM HOOK on_stream_changed API调用,参数:" + JSONObject.toJSONString(item));
265 267 }
266   - String mediaServerId = json.getString("mediaServerId");
  268 + String mediaServerId = item.getMediaServerId();
  269 + JSONObject json = (JSONObject) JSON.toJSON(item);
267 270 ZLMHttpHookSubscribe.Event subscribe = this.subscribe.getSubscribe(ZLMHttpHookSubscribe.HookType.on_stream_changed, json);
268 271 if (subscribe != null ) {
269 272 MediaServerItem mediaInfo = mediaServerService.getOne(mediaServerId);
... ... @@ -272,13 +275,12 @@ public class ZLMHttpHookListener {
272 275 }
273 276  
274 277 }
275   -
276 278 // 流消失移除redis play
277   - String app = json.getString("app");
278   - String streamId = json.getString("stream");
279   - String schema = json.getString("schema");
280   - JSONArray tracks = json.getJSONArray("tracks");
281   - boolean regist = json.getBoolean("regist");
  279 + String app = item.getApp();
  280 + String streamId = item.getStream();
  281 + String schema = item.getSchema();
  282 + List<MediaItem.MediaTrack> tracks = item.getTracks();
  283 + boolean regist = item.isRegist();
282 284 if (tracks != null) {
283 285 logger.info("[stream: " + streamId + "] on_stream_changed->>" + schema);
284 286 }
... ... @@ -298,24 +300,34 @@ public class ZLMHttpHookListener {
298 300 redisCatchStorage.stopPlayback(streamInfo);
299 301 }
300 302 }else {
301   - if (!"rtp".equals(app) ){
302   - // 发送流变化redis消息
303   - JSONObject jsonObject = new JSONObject();
304   - jsonObject.put("serverId", userSetup.getServerId());
305   - jsonObject.put("app", app);
306   - jsonObject.put("stream", streamId);
307   - jsonObject.put("register", regist);
308   - jsonObject.put("mediaServerId", mediaServerId);
309   - redisCatchStorage.sendStreamChangeMsg(jsonObject);
  303 + if (!"rtp".equals(app)){
  304 +
  305 + boolean pushChange = false;
310 306  
311 307 MediaServerItem mediaServerItem = mediaServerService.getOne(mediaServerId);
312 308 if (regist) {
313   - zlmMediaListManager.addMedia(mediaServerItem, app, streamId);
314   - StreamInfo streamInfo = mediaService.getStreamInfoByAppAndStream(mediaServerItem, app, streamId, tracks);
315   - redisCatchStorage.addStream(mediaServerItem, app, streamId, streamInfo);
  309 + if ((item.getOriginType() == 1 || item.getOriginType() == 2 || item.getOriginType() == 8)) {
  310 + pushChange = true;
  311 + zlmMediaListManager.addMedia(item);
  312 + StreamInfo streamInfo = mediaService.getStreamInfoByAppAndStream(mediaServerItem, app, streamId, tracks);
  313 + redisCatchStorage.addPushStream(mediaServerItem, app, streamId, streamInfo);
  314 + }
316 315 }else {
317   - zlmMediaListManager.removeMedia( app, streamId);
318   - redisCatchStorage.removeStream(mediaServerItem, app, streamId);
  316 + int result = zlmMediaListManager.removeMedia( app, streamId);
  317 + redisCatchStorage.removePushStream(mediaServerItem, app, streamId);
  318 + if (result > 0) {
  319 + pushChange = true;
  320 + }
  321 + }
  322 + if(pushChange) {
  323 + // 发送流变化redis消息
  324 + JSONObject jsonObject = new JSONObject();
  325 + jsonObject.put("serverId", userSetup.getServerId());
  326 + jsonObject.put("app", app);
  327 + jsonObject.put("stream", streamId);
  328 + jsonObject.put("register", regist);
  329 + jsonObject.put("mediaServerId", mediaServerId);
  330 + redisCatchStorage.sendStreamChangeMsg(jsonObject);
319 331 }
320 332 }
321 333 }
... ...
src/main/java/com/genersoft/iot/vmp/media/zlm/ZLMMediaListManager.java
1 1 package com.genersoft.iot.vmp.media.zlm;
2 2  
3 3 import com.alibaba.fastjson.JSONObject;
  4 +import com.genersoft.iot.vmp.media.zlm.dto.MediaItem;
4 5 import com.genersoft.iot.vmp.media.zlm.dto.MediaServerItem;
5 6 import com.genersoft.iot.vmp.media.zlm.dto.StreamProxyItem;
6 7 import com.genersoft.iot.vmp.media.zlm.dto.StreamPushItem;
... ... @@ -87,6 +88,10 @@ public class ZLMMediaListManager {
87 88 updateMedia(mediaServerItem, app, streamId);
88 89 }
89 90  
  91 + public void addMedia(MediaItem mediaItem) {
  92 + storager.updateMedia(streamPushService.transform(mediaItem));
  93 + }
  94 +
90 95  
91 96 public void updateMedia(MediaServerItem mediaServerItem, String app, String streamId) {
92 97 //使用异步更新推流
... ... @@ -113,14 +118,16 @@ public class ZLMMediaListManager {
113 118 }
114 119  
115 120  
116   - public void removeMedia(String app, String streamId) {
  121 + public int removeMedia(String app, String streamId) {
117 122 // 查找是否关联了国标, 关联了不删除, 置为离线
118 123 StreamProxyItem streamProxyItem = gbStreamMapper.selectOne(app, streamId);
  124 + int result = 0;
119 125 if (streamProxyItem == null) {
120   - storager.removeMedia(app, streamId);
  126 + result = storager.removeMedia(app, streamId);
121 127 }else {
122   - storager.mediaOutline(app, streamId);
  128 + result =storager.mediaOutline(app, streamId);
123 129 }
  130 + return result;
124 131 }
125 132  
126 133 // public void clearAllSessions() {
... ...
src/main/java/com/genersoft/iot/vmp/media/zlm/dto/MediaItem.java
... ... @@ -5,6 +5,11 @@ import java.util.List;
5 5 public class MediaItem {
6 6  
7 7 /**
  8 + * 注册/注销
  9 + */
  10 + private boolean regist;
  11 +
  12 + /**
8 13 * 应用名
9 14 */
10 15 private String app;
... ... @@ -54,6 +59,11 @@ public class MediaItem {
54 59 private String originUrl;
55 60  
56 61 /**
  62 + * 服务器id
  63 + */
  64 + private String mediaServerId;
  65 +
  66 + /**
57 67 * GMT unix系统时间戳,单位秒
58 68 */
59 69 private Long createStamp;
... ... @@ -78,6 +88,14 @@ public class MediaItem {
78 88 */
79 89 private String vhost;
80 90  
  91 + public boolean isRegist() {
  92 + return regist;
  93 + }
  94 +
  95 + public void setRegist(boolean regist) {
  96 + this.regist = regist;
  97 + }
  98 +
81 99 /**
82 100 * 是否是docker部署, docker部署不会自动更新zlm使用的端口,需要自己手动修改
83 101 */
... ... @@ -376,4 +394,12 @@ public class MediaItem {
376 394 public void setDocker(boolean docker) {
377 395 this.docker = docker;
378 396 }
  397 +
  398 + public String getMediaServerId() {
  399 + return mediaServerId;
  400 + }
  401 +
  402 + public void setMediaServerId(String mediaServerId) {
  403 + this.mediaServerId = mediaServerId;
  404 + }
379 405 }
... ...
src/main/java/com/genersoft/iot/vmp/media/zlm/dto/StreamProxyItem.java
... ... @@ -17,6 +17,7 @@ public class StreamProxyItem extends GbStream {
17 17 private boolean enable;
18 18 private boolean enable_hls;
19 19 private boolean enable_mp4;
  20 + private boolean enable_remove_none_reader; // 无人观看时删除
20 21 private String platformGbId;
21 22 private String createTime;
22 23  
... ... @@ -142,4 +143,12 @@ public class StreamProxyItem extends GbStream {
142 143 public void setCreateTime(String createTime) {
143 144 this.createTime = createTime;
144 145 }
  146 +
  147 + public boolean isEnable_remove_none_reader() {
  148 + return enable_remove_none_reader;
  149 + }
  150 +
  151 + public void setEnable_remove_none_reader(boolean enable_remove_none_reader) {
  152 + this.enable_remove_none_reader = enable_remove_none_reader;
  153 + }
145 154 }
... ...
src/main/java/com/genersoft/iot/vmp/service/IMediaService.java
... ... @@ -32,7 +32,7 @@ public interface IMediaService {
32 32 * @param stream
33 33 * @return
34 34 */
35   - StreamInfo getStreamInfoByAppAndStream(MediaServerItem mediaServerItem, String app, String stream, JSONArray tracks);
  35 + StreamInfo getStreamInfoByAppAndStream(MediaServerItem mediaServerItem, String app, String stream, Object tracks);
36 36  
37 37 /**
38 38 * 根据应用名和流ID获取播放地址, 只是地址拼接,返回的ip使用远程访问ip,适用与zlm与wvp在一台主机的情况
... ... @@ -40,5 +40,5 @@ public interface IMediaService {
40 40 * @param stream
41 41 * @return
42 42 */
43   - StreamInfo getStreamInfoByAppAndStream(MediaServerItem mediaInfo, String app, String stream, JSONArray tracks, String addr);
  43 + StreamInfo getStreamInfoByAppAndStream(MediaServerItem mediaInfo, String app, String stream, Object tracks, String addr);
44 44 }
... ...
src/main/java/com/genersoft/iot/vmp/service/IStreamPushService.java
1 1 package com.genersoft.iot.vmp.service;
2 2  
3 3 import com.genersoft.iot.vmp.gb28181.bean.GbStream;
  4 +import com.genersoft.iot.vmp.media.zlm.dto.MediaItem;
4 5 import com.genersoft.iot.vmp.media.zlm.dto.MediaServerItem;
5 6 import com.genersoft.iot.vmp.media.zlm.dto.StreamPushItem;
6 7 import com.github.pagehelper.PageInfo;
... ... @@ -32,4 +33,6 @@ public interface IStreamPushService {
32 33 * @return
33 34 */
34 35 PageInfo<StreamPushItem> getPushList(Integer page, Integer count);
  36 +
  37 + StreamPushItem transform(MediaItem item);
35 38 }
... ...
src/main/java/com/genersoft/iot/vmp/service/impl/MediaServiceImpl.java
... ... @@ -5,6 +5,7 @@ import com.alibaba.fastjson.JSONArray;
5 5 import com.alibaba.fastjson.JSONObject;
6 6 import com.genersoft.iot.vmp.common.StreamInfo;
7 7 import com.genersoft.iot.vmp.media.zlm.ZLMRESTfulUtils;
  8 +import com.genersoft.iot.vmp.media.zlm.dto.MediaItem;
8 9 import com.genersoft.iot.vmp.media.zlm.dto.MediaServerItem;
9 10 import com.genersoft.iot.vmp.service.IMediaServerService;
10 11 import com.genersoft.iot.vmp.storager.IRedisCatchStorage;
... ... @@ -31,7 +32,7 @@ public class MediaServiceImpl implements IMediaService {
31 32  
32 33  
33 34 @Override
34   - public StreamInfo getStreamInfoByAppAndStream(MediaServerItem mediaInfo, String app, String stream, JSONArray tracks) {
  35 + public StreamInfo getStreamInfoByAppAndStream(MediaServerItem mediaInfo, String app, String stream, Object tracks) {
35 36 return getStreamInfoByAppAndStream(mediaInfo, app, stream, tracks, null);
36 37 }
37 38  
... ... @@ -69,7 +70,7 @@ public class MediaServiceImpl implements IMediaService {
69 70 }
70 71  
71 72 @Override
72   - public StreamInfo getStreamInfoByAppAndStream(MediaServerItem mediaInfo, String app, String stream, JSONArray tracks, String addr) {
  73 + public StreamInfo getStreamInfoByAppAndStream(MediaServerItem mediaInfo, String app, String stream, Object tracks, String addr) {
73 74 StreamInfo streamInfoResult = new StreamInfo();
74 75 streamInfoResult.setStreamId(stream);
75 76 streamInfoResult.setApp(app);
... ...
src/main/java/com/genersoft/iot/vmp/service/impl/StreamPushServiceImpl.java
... ... @@ -51,33 +51,38 @@ public class StreamPushServiceImpl implements IStreamPushService {
51 51 for (MediaItem item : mediaItems) {
52 52  
53 53 // 不保存国标推理以及拉流代理的流
54   - if (item.getOriginType() == 3 || item.getOriginType() == 4 || item.getOriginType() == 5) {
55   - continue;
56   - }
57   - String key = item.getApp() + "_" + item.getStream();
58   - StreamPushItem streamPushItem = result.get(key);
59   - if (streamPushItem == null) {
60   - streamPushItem = new StreamPushItem();
61   - streamPushItem.setApp(item.getApp());
62   - streamPushItem.setMediaServerId(mediaServerItem.getId());
63   - streamPushItem.setStream(item.getStream());
64   - streamPushItem.setAliveSecond(item.getAliveSecond());
65   - streamPushItem.setCreateStamp(item.getCreateStamp());
66   - streamPushItem.setOriginSock(item.getOriginSock());
67   - streamPushItem.setTotalReaderCount(item.getTotalReaderCount());
68   - streamPushItem.setOriginType(item.getOriginType());
69   - streamPushItem.setOriginTypeStr(item.getOriginTypeStr());
70   - streamPushItem.setOriginUrl(item.getOriginUrl());
71   - streamPushItem.setCreateStamp(item.getCreateStamp());
72   - streamPushItem.setAliveSecond(item.getAliveSecond());
73   - streamPushItem.setStatus(true);
74   - streamPushItem.setVhost(item.getVhost());
75   - result.put(key, streamPushItem);
  54 + if (item.getOriginType() == 1 || item.getOriginType() == 2 || item.getOriginType() == 8) {
  55 + String key = item.getApp() + "_" + item.getStream();
  56 + StreamPushItem streamPushItem = result.get(key);
  57 + if (streamPushItem == null) {
  58 + streamPushItem = transform(item);
  59 + result.put(key, streamPushItem);
  60 + }
76 61 }
  62 +
77 63 }
78 64  
79 65 return new ArrayList<>(result.values());
80 66 }
  67 + @Override
  68 + public StreamPushItem transform(MediaItem item) {
  69 + StreamPushItem streamPushItem = new StreamPushItem();
  70 + streamPushItem.setApp(item.getApp());
  71 + streamPushItem.setMediaServerId(item.getMediaServerId());
  72 + streamPushItem.setStream(item.getStream());
  73 + streamPushItem.setAliveSecond(item.getAliveSecond());
  74 + streamPushItem.setCreateStamp(item.getCreateStamp());
  75 + streamPushItem.setOriginSock(item.getOriginSock());
  76 + streamPushItem.setTotalReaderCount(item.getTotalReaderCount());
  77 + streamPushItem.setOriginType(item.getOriginType());
  78 + streamPushItem.setOriginTypeStr(item.getOriginTypeStr());
  79 + streamPushItem.setOriginUrl(item.getOriginUrl());
  80 + streamPushItem.setCreateStamp(item.getCreateStamp());
  81 + streamPushItem.setAliveSecond(item.getAliveSecond());
  82 + streamPushItem.setStatus(true);
  83 + streamPushItem.setVhost(item.getVhost());
  84 + return streamPushItem;
  85 + }
81 86  
82 87 @Override
83 88 public PageInfo<StreamPushItem> getPushList(Integer page, Integer count) {
... ...
src/main/java/com/genersoft/iot/vmp/storager/IRedisCatchStorage.java
... ... @@ -135,7 +135,7 @@ public interface IRedisCatchStorage {
135 135 * @param app
136 136 * @param streamId
137 137 */
138   - void addStream(MediaServerItem mediaServerItem, String app, String streamId, StreamInfo streamInfo);
  138 + void addPushStream(MediaServerItem mediaServerItem, String app, String streamId, StreamInfo streamInfo);
139 139  
140 140 /**
141 141 * 移除流信息从redis
... ... @@ -143,5 +143,5 @@ public interface IRedisCatchStorage {
143 143 * @param app
144 144 * @param streamId
145 145 */
146   - void removeStream(MediaServerItem mediaServerItem, String app, String streamId);
  146 + void removePushStream(MediaServerItem mediaServerItem, String app, String streamId);
147 147 }
... ...
src/main/java/com/genersoft/iot/vmp/storager/IVideoManagerStorager.java
... ... @@ -353,7 +353,7 @@ public interface IVideoManagerStorager {
353 353 * @param app
354 354 * @param stream
355 355 */
356   - void removeMedia(String app, String stream);
  356 + int removeMedia(String app, String stream);
357 357  
358 358  
359 359 /**
... ... @@ -366,7 +366,7 @@ public interface IVideoManagerStorager {
366 366 * @param app
367 367 * @param streamId
368 368 */
369   - void mediaOutline(String app, String streamId);
  369 + int mediaOutline(String app, String streamId);
370 370  
371 371 /**
372 372 * 设置平台在线/离线
... ...
src/main/java/com/genersoft/iot/vmp/storager/dao/GbStreamMapper.java
... ... @@ -53,7 +53,7 @@ public interface GbStreamMapper {
53 53 @Update("UPDATE gb_stream " +
54 54 "SET status=${status} " +
55 55 "WHERE app=#{app} AND stream=#{stream}")
56   - void setStatus(String app, String stream, boolean status);
  56 + int setStatus(String app, String stream, boolean status);
57 57  
58 58 @Select("SELECT gs.*, pgs.platformId FROM gb_stream gs LEFT JOIN platform_gb_stream pgs ON gs.app = pgs.app AND gs.stream = pgs.stream WHERE mediaServerId=#{mediaServerId} ")
59 59 List<GbStream> selectAllByMediaServerId(String mediaServerId);
... ...
src/main/java/com/genersoft/iot/vmp/storager/impl/RedisCatchStorageImpl.java
... ... @@ -308,13 +308,13 @@ public class RedisCatchStorageImpl implements IRedisCatchStorage {
308 308 }
309 309  
310 310 @Override
311   - public void addStream(MediaServerItem mediaServerItem, String app, String streamId, StreamInfo streamInfo) {
  311 + public void addPushStream(MediaServerItem mediaServerItem, String app, String streamId, StreamInfo streamInfo) {
312 312 String key = VideoManagerConstants.WVP_SERVER_STREAM_PUSH_PREFIX + app + "_" + streamId + "_" + mediaServerItem.getId();
313 313 redis.set(key, streamInfo);
314 314 }
315 315  
316 316 @Override
317   - public void removeStream(MediaServerItem mediaServerItem, String app, String streamId) {
  317 + public void removePushStream(MediaServerItem mediaServerItem, String app, String streamId) {
318 318 String key = VideoManagerConstants.WVP_SERVER_STREAM_PUSH_PREFIX + app + "_" + streamId + "_" + mediaServerItem.getId();
319 319 redis.del(key);
320 320 }
... ...
src/main/java/com/genersoft/iot/vmp/storager/impl/VideoManagerStoragerImpl.java
... ... @@ -605,8 +605,8 @@ public class VideoManagerStoragerImpl implements IVideoManagerStorager {
605 605 }
606 606  
607 607 @Override
608   - public void removeMedia(String app, String stream) {
609   - streamPushMapper.del(app, stream);
  608 + public int removeMedia(String app, String stream) {
  609 + return streamPushMapper.del(app, stream);
610 610 }
611 611  
612 612 @Override
... ... @@ -615,8 +615,8 @@ public class VideoManagerStoragerImpl implements IVideoManagerStorager {
615 615 }
616 616  
617 617 @Override
618   - public void mediaOutline(String app, String streamId) {
619   - gbStreamMapper.setStatus(app, streamId, false);
  618 + public int mediaOutline(String app, String streamId) {
  619 + return gbStreamMapper.setStatus(app, streamId, false);
620 620 }
621 621  
622 622 @Override
... ...