gaofw189
2023-01-10 26cd7dbaf9394ff26f5229b18cfdb72c203a6bc3
src/main/java/com/genersoft/iot/vmp/media/zlm/ZLMHttpHookListener.java
@@ -1,41 +1,39 @@
package com.genersoft.iot.vmp.media.zlm;
import java.text.ParseException;
import java.util.HashMap;
import java.util.List;
import java.util.Map;
import com.alibaba.fastjson2.JSON;
import com.alibaba.fastjson2.JSONObject;
import com.genersoft.iot.vmp.common.StreamInfo;
import com.genersoft.iot.vmp.conf.UserSetting;
import com.genersoft.iot.vmp.conf.exception.SsrcTransactionNotFoundException;
import com.genersoft.iot.vmp.gb28181.bean.*;
import com.genersoft.iot.vmp.gb28181.event.EventPublisher;
import com.genersoft.iot.vmp.gb28181.session.VideoStreamSessionManager;
import com.genersoft.iot.vmp.gb28181.transmit.cmd.impl.SIPCommander;
import com.genersoft.iot.vmp.gb28181.transmit.cmd.impl.SIPCommanderFroPlatform;
import com.genersoft.iot.vmp.media.zlm.dto.*;
import com.genersoft.iot.vmp.media.zlm.dto.HookType;
import com.genersoft.iot.vmp.media.zlm.dto.MediaServerItem;
import com.genersoft.iot.vmp.media.zlm.dto.StreamAuthorityInfo;
import com.genersoft.iot.vmp.media.zlm.dto.StreamProxyItem;
import com.genersoft.iot.vmp.media.zlm.dto.hook.*;
import com.genersoft.iot.vmp.service.*;
import com.genersoft.iot.vmp.storager.IRedisCatchStorage;
import com.genersoft.iot.vmp.storager.IVideoManagerStorage;
import com.genersoft.iot.vmp.vmanager.bean.StreamContent;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.beans.factory.annotation.Qualifier;
import org.springframework.scheduling.concurrent.ThreadPoolTaskExecutor;
import org.springframework.util.ObjectUtils;
import org.springframework.web.bind.annotation.PostMapping;
import org.springframework.web.bind.annotation.RequestBody;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.ResponseBody;
import org.springframework.web.bind.annotation.RestController;
import com.alibaba.fastjson2.JSONObject;
import com.genersoft.iot.vmp.gb28181.transmit.cmd.impl.SIPCommander;
import org.springframework.web.bind.annotation.*;
import javax.servlet.http.HttpServletRequest;
import javax.sip.InvalidArgumentException;
import javax.sip.SipException;
import java.text.ParseException;
import java.util.HashMap;
import java.util.List;
import java.util.Map;
/**    
 * @description:针对 ZLMediaServer的hook事件监听
@@ -186,7 +184,7 @@
      if (!"rtp".equals(param.getApp())) {
         if (userSetting.getPushAuthority()) {
// 推流鉴权
            // 推流鉴权
            if (param.getParams() == null) {
               logger.info("推流鉴权失败: 缺少不要参数:sign=md5(user表的pushKey)");
               ret.put("code", 401);
@@ -350,7 +348,7 @@
                        }
                        StreamInfo streamInfoByAppAndStream = mediaService.getStreamInfoByAppAndStream(mediaServerItem,
                              param.getApp(), param.getStream(), tracks, callId);
                        param.setStreamInfo(streamInfoByAppAndStream);
                        param.setStreamInfo(new StreamContent(streamInfoByAppAndStream));
                        redisCatchStorage.addStream(mediaServerItem, type, param.getApp(), param.getStream(), param);
                        if (param.getOriginType() == OriginType.RTSP_PUSH.ordinal()
                              || param.getOriginType() == OriginType.RTMP_PUSH.ordinal()
@@ -367,7 +365,7 @@
                        }
                        GbStream gbStream = storager.getGbStream(param.getApp(), param.getStream());
                        if (gbStream != null) {
//                        eventPublisher.catalogEventPublishForStream(null, gbStream, CatalogEvent.OFF);
//                           eventPublisher.catalogEventPublishForStream(null, gbStream, CatalogEvent.OFF);
                        }
                        zlmMediaListManager.removeMedia(param.getApp(), param.getStream());
                     }
@@ -426,7 +424,7 @@
      logger.info("[ZLM HOOK]流无人观看:{]->{}->{}/{}" + param.getMediaServerId(), param.getSchema(), param.getApp(), param.getStream());
      JSONObject ret = new JSONObject();
      ret.put("code", 0);
      // 录像下载
      // 国标类型的流
      if ("rtp".equals(param.getApp())){
         ret.put("close", userSetting.getStreamOnDemand());
         // 国标流, 点播/录像回放/录像下载
@@ -508,6 +506,7 @@
               // 修改数据
               streamProxyService.stop(param.getApp(), param.getStream());
            }else {
               // 无人观看不做处理
               ret.put("close", false);
            }
            return ret;
@@ -529,7 +528,7 @@
   @ResponseBody
   @PostMapping(value = "/on_stream_not_found", produces = "application/json;charset=UTF-8")
   public JSONObject onStreamNotFound(@RequestBody OnStreamNotFoundHookParam param){
      logger.info("[ZLM HOOK] 流未找到:{}->{}->{}/{}" + param.getMediaServerId(), param.getSchema(), param.getApp(), param.getStream());
      logger.info("[ZLM HOOK] 流未找到:{}->{}->{}/{}", param.getMediaServerId(), param.getSchema(), param.getApp(), param.getStream());
      taskExecutor.execute(()->{
         MediaServerItem mediaInfo = mediaServerService.getOne(param.getMediaServerId());
         if (userSetting.isAutoApplyPlay() && mediaInfo != null) {
@@ -597,7 +596,7 @@
   @PostMapping(value = "/on_send_rtp_stopped", produces = "application/json;charset=UTF-8")
   public JSONObject onSendRtpStopped(HttpServletRequest request, @RequestBody OnSendRtpStoppedHookParam param){
      logger.info("[ZLM HOOK] 发送rtp被动关闭:{}->{}/{}", param.getMediaServerId(), param.getApp(), param.getStream());
      logger.info("[ZLM HOOK] rtp发送关闭:{}->{}/{}", param.getMediaServerId(), param.getApp(), param.getStream());
      JSONObject ret = new JSONObject();
      ret.put("code", 0);
@@ -627,6 +626,31 @@
      return ret;
   }
   /**
    * rtpServer收流超时
    */
   @ResponseBody
   @PostMapping(value = "/on_rtp_server_timeout", produces = "application/json;charset=UTF-8")
   public JSONObject onRtpServerTimeout(HttpServletRequest request, @RequestBody OnRtpServerTimeoutHookParam param){
      logger.info("[ZLM HOOK] rtpServer收流超时:{}->{}({})", param.getMediaServerId(), param.getStream_id(), param.getSsrc());
      JSONObject ret = new JSONObject();
      ret.put("code", 0);
      ret.put("msg", "success");
      taskExecutor.execute(()->{
         JSONObject json = (JSONObject) JSON.toJSON(param);
         List<ZlmHttpHookSubscribe.Event> subscribes = this.subscribe.getSubscribes(HookType.on_rtp_server_timeout);
         if (subscribes != null  && subscribes.size() > 0) {
            for (ZlmHttpHookSubscribe.Event subscribe : subscribes) {
               subscribe.response(null, json);
            }
         }
      });
      return ret;
   }
   private Map<String, String> urlParamToMap(String params) {
      HashMap<String, String> map = new HashMap<>();
      if (ObjectUtils.isEmpty(params)) {