648540858
2022-06-23 0da452293f15be019bf23923148691ca133e43b0
src/main/java/com/genersoft/iot/vmp/media/zlm/ZLMHttpHookListener.java
@@ -2,24 +2,20 @@
import java.util.ArrayList;
import java.util.List;
import java.util.UUID;
import com.alibaba.fastjson.JSON;
import com.genersoft.iot.vmp.common.StreamInfo;
import com.genersoft.iot.vmp.conf.MediaConfig;
import com.genersoft.iot.vmp.conf.UserSetup;
import com.genersoft.iot.vmp.conf.UserSetting;
import com.genersoft.iot.vmp.gb28181.bean.Device;
import com.genersoft.iot.vmp.gb28181.bean.DeviceChannel;
import com.genersoft.iot.vmp.gb28181.bean.GbStream;
import com.genersoft.iot.vmp.gb28181.bean.SsrcTransaction;
import com.genersoft.iot.vmp.gb28181.event.EventPublisher;
import com.genersoft.iot.vmp.gb28181.event.subscribe.catalog.CatalogEvent;
import com.genersoft.iot.vmp.gb28181.session.VideoStreamSessionManager;
import com.genersoft.iot.vmp.media.zlm.dto.*;
import com.genersoft.iot.vmp.service.*;
import com.genersoft.iot.vmp.service.bean.SSRCInfo;
import com.genersoft.iot.vmp.storager.IRedisCatchStorage;
import com.genersoft.iot.vmp.storager.IVideoManagerStorager;
import com.genersoft.iot.vmp.storager.IVideoManagerStorage;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
import org.springframework.beans.factory.annotation.Autowired;
@@ -54,7 +50,7 @@
   private IPlayService playService;
   @Autowired
   private IVideoManagerStorager storager;
   private IVideoManagerStorage storager;
   @Autowired
   private IRedisCatchStorage redisCatchStorage;
@@ -81,7 +77,7 @@
   private ZLMHttpHookSubscribe subscribe;
   @Autowired
   private UserSetup userSetup;
   private UserSetting userSetting;
   @Autowired
   private VideoStreamSessionManager sessionManager;
@@ -95,10 +91,9 @@
   public ResponseEntity<String> onServerKeepalive(@RequestBody JSONObject json){
      if (logger.isDebugEnabled()) {
         logger.debug("[ ZLM HOOK ]on_server_keepalive API调用,参数:" + json.toString());
         logger.debug("[ ZLM HOOK ] on_server_keepalive API调用,参数:" + json.toString());
      }
      String mediaServerId = json.getString("mediaServerId");
      List<ZLMHttpHookSubscribe.Event> subscribes = this.subscribe.getSubscribes(ZLMHttpHookSubscribe.HookType.on_server_keepalive);
      if (subscribes != null  && subscribes.size() > 0) {
         for (ZLMHttpHookSubscribe.Event subscribe : subscribes) {
@@ -168,7 +163,6 @@
         if (mediaInfo != null) {
            subscribe.response(mediaInfo, json);
         }
      }
      JSONObject ret = new JSONObject();
      ret.put("code", 0);
@@ -189,6 +183,12 @@
      ret.put("code", 0);
      ret.put("msg", "success");
      ret.put("enable_hls", true);
      if (json.getInteger("originType") == 1
            || json.getInteger("originType") == 2
            || json.getInteger("originType") == 3) {
         ret.put("enable_audio", true);
      }
      String mediaServerId = json.getString("mediaServerId");
      ZLMHttpHookSubscribe.Event subscribe = this.subscribe.getSubscribe(ZLMHttpHookSubscribe.HookType.on_publish, json);
      if (subscribe != null) {
@@ -203,9 +203,9 @@
       String app = json.getString("app");
       String stream = json.getString("stream");
      if ("rtp".equals(app)) {
         ret.put("enable_mp4", userSetup.getRecordSip());
         ret.put("enable_mp4", userSetting.getRecordSip());
      }else {
         ret.put("enable_mp4", userSetup.isRecordPushLive());
         ret.put("enable_mp4", userSetting.isRecordPushLive());
      }
      List<SsrcTransaction> ssrcTransactionForAll = sessionManager.getSsrcTransactionForAll(null, null, null, stream);
      if (ssrcTransactionForAll != null && ssrcTransactionForAll.size() == 1) {
@@ -215,7 +215,16 @@
         if (deviceChannel != null) {
            ret.put("enable_audio", deviceChannel.isHasAudio());
         }
         // 如果是录像下载就设置视频间隔十秒
         if (ssrcTransactionForAll.get(0).getType() == VideoStreamSessionManager.SessionType.download) {
            ret.put("mp4_max_second", 10);
            ret.put("enable_mp4", true);
            ret.put("enable_audio", true);
         }
      }
      return new ResponseEntity<String>(ret.toString(), HttpStatus.OK);
   }
   
@@ -229,6 +238,23 @@
      
      if (logger.isDebugEnabled()) {
         logger.debug("[ ZLM HOOK ]on_record_mp4 API调用,参数:" + json.toString());
      }
      String mediaServerId = json.getString("mediaServerId");
      JSONObject ret = new JSONObject();
      ret.put("code", 0);
      ret.put("msg", "success");
      return new ResponseEntity<String>(ret.toString(),HttpStatus.OK);
   }
   /**
    * 录制hls完成后通知事件;此事件对回复不敏感。
    *
    */
   @ResponseBody
   @PostMapping(value = "/on_record_ts", produces = "application/json;charset=UTF-8")
   public ResponseEntity<String> onRecordTs(@RequestBody JSONObject json){
      if (logger.isDebugEnabled()) {
         logger.debug("[ ZLM HOOK ]on_record_ts API调用,参数:" + json.toString());
      }
      String mediaServerId = json.getString("mediaServerId");
      JSONObject ret = new JSONObject();
@@ -324,7 +350,6 @@
         if (mediaInfo != null) {
            subscribe.response(mediaInfo, json);
         }
      }
      // 流消失移除redis play
      String app = item.getApp();
@@ -372,21 +397,22 @@
                     if (item.getOriginType() == OriginType.RTSP_PUSH.ordinal()
                           || item.getOriginType() == OriginType.RTMP_PUSH.ordinal()
                           || item.getOriginType() == OriginType.RTC_PUSH.ordinal() ) {
                        streamPushItem = zlmMediaListManager.addPush(item);
                        item.setSeverId(userSetting.getServerId());
                        zlmMediaListManager.addPush(item);
                     }
                     List<GbStream> gbStreams = new ArrayList<>();
                     if (streamPushItem == null || streamPushItem.getGbId() == null) {
                        GbStream gbStream = storager.getGbStream(app, streamId);
                        gbStreams.add(gbStream);
                     }else {
                        if (streamPushItem.getGbId() != null) {
                           gbStreams.add(streamPushItem);
                        }
                     }
                     if (gbStreams.size() > 0) {
                        eventPublisher.catalogEventPublishForStream(null, gbStreams, CatalogEvent.ON);
                     }
//                     List<GbStream> gbStreams = new ArrayList<>();
//                     if (streamPushItem == null || streamPushItem.getGbId() == null) {
//                        GbStream gbStream = storager.getGbStream(app, streamId);
//                        gbStreams.add(gbStream);
//                     }else {
//                        if (streamPushItem.getGbId() != null) {
//                           gbStreams.add(streamPushItem);
//                        }
//                     }
//                     if (gbStreams.size() > 0) {
//                        eventPublisher.catalogEventPublishForStream(null, gbStreams, CatalogEvent.ON);
//                     }
                  }else {
                     // 兼容流注销时类型从redis记录获取
@@ -397,14 +423,14 @@
                     }
                     GbStream gbStream = storager.getGbStream(app, streamId);
                     if (gbStream != null) {
                        eventPublisher.catalogEventPublishForStream(null, gbStream, CatalogEvent.OFF);
//                        eventPublisher.catalogEventPublishForStream(null, gbStream, CatalogEvent.OFF);
                     }
                     zlmMediaListManager.removeMedia(app, streamId);
                  }
                  if (type != null) {
                     // 发送流变化redis消息
                     JSONObject jsonObject = new JSONObject();
                     jsonObject.put("serverId", userSetup.getServerId());
                     jsonObject.put("serverId", userSetting.getServerId());
                     jsonObject.put("app", app);
                     jsonObject.put("stream", streamId);
                     jsonObject.put("register", regist);
@@ -441,6 +467,7 @@
      if ("rtp".equals(app)){
         ret.put("close", true);
         StreamInfo streamInfoForPlayCatch = redisCatchStorage.queryPlayByStreamId(streamId);
         SsrcTransaction ssrcTransaction = sessionManager.getSsrcTransaction(null, null, null, streamId);
         if (streamInfoForPlayCatch != null) {
            // 如果在给上级推流,也不停止。
            if (redisCatchStorage.isChannelSendingRTP(streamInfoForPlayCatch.getChannelId())) {
@@ -497,7 +524,7 @@
      }
      String mediaServerId = json.getString("mediaServerId");
      MediaServerItem mediaInfo = mediaServerService.getOne(mediaServerId);
      if (userSetup.isAutoApplyPlay() && mediaInfo != null && mediaInfo.isRtpEnable()) {
      if (userSetting.isAutoApplyPlay() && mediaInfo != null && mediaInfo.isRtpEnable()) {
         String app = json.getString("app");
         String streamId = json.getString("stream");
         if ("rtp".equals(app)) {