|  |  | 
 |  |  | import java.text.DecimalFormat;
 | 
 |  |  | import java.util.ArrayList;
 | 
 |  |  | import java.util.List;
 | 
 |  |  | import java.util.UUID;
 | 
 |  |  | 
 | 
 |  |  | import com.alibaba.fastjson.JSON;
 | 
 |  |  | import com.alibaba.fastjson.JSONArray;
 | 
 |  |  | import com.genersoft.iot.vmp.common.StreamInfo;
 | 
 |  |  | import com.genersoft.iot.vmp.conf.MediaServerConfig;
 | 
 |  |  | import com.genersoft.iot.vmp.gb28181.bean.Device;
 | 
 |  |  | import com.genersoft.iot.vmp.storager.IRedisCatchStorage;
 | 
 |  |  | import com.genersoft.iot.vmp.storager.IVideoManagerStorager;
 | 
 |  |  | import com.genersoft.iot.vmp.utils.IpUtil;
 | 
 |  |  | import com.genersoft.iot.vmp.vmanager.service.IPlayService;
 | 
 |  |  | import org.slf4j.Logger;
 | 
 |  |  | import org.slf4j.LoggerFactory;
 | 
 |  |  | import org.springframework.beans.factory.annotation.Autowired;
 | 
 |  |  | import org.springframework.beans.factory.annotation.Value;
 | 
 |  |  | import org.springframework.http.HttpStatus;
 | 
 |  |  | import org.springframework.http.ResponseEntity;
 | 
 |  |  | import org.springframework.util.StringUtils;
 | 
 |  |  | import org.springframework.web.bind.annotation.PostMapping;
 | 
 |  |  | import org.springframework.web.bind.annotation.RequestBody;
 | 
 |  |  | import org.springframework.web.bind.annotation.RequestMapping;
 | 
 |  |  | 
 |  |  |    private SIPCommander cmder;
 | 
 |  |  | 
 | 
 |  |  |    @Autowired
 | 
 |  |  |    private IPlayService playService;
 | 
 |  |  | 
 | 
 |  |  |    @Autowired
 | 
 |  |  |    private IVideoManagerStorager storager;
 | 
 |  |  | 	 | 
 |  |  | 
 | 
 |  |  |    @Autowired
 | 
 |  |  |    private IRedisCatchStorage redisCatchStorage;
 | 
 |  |  | 
 | 
 |  |  |    @Autowired
 | 
 |  |  |    private ZLMRESTfulUtils zlmresTfulUtils;
 | 
 |  |  | 
 | 
 |  |  |    @Autowired
 | 
 |  |  |    private ZLMHttpHookSubscribe subscribe;
 | 
 |  |  | 
 | 
 |  |  |    @Value("${media.autoApplyPlay}")
 | 
 |  |  |    private boolean autoApplyPlay;
 | 
 |  |  | 
 | 
 |  |  |    @Value("${media.ip}")
 | 
 |  |  |    private String mediaIp;
 | 
 |  |  | 
 | 
 |  |  |    @Value("${media.wanIp}")
 | 
 |  |  |    private String mediaWanIp;
 | 
 |  |  | 
 | 
 |  |  |    @Value("${media.port}")
 | 
 |  |  |    private int mediaPort;
 | 
 |  |  | 
 | 
 |  |  |    /**
 | 
 |  |  |     * 流量统计事件,播放器或推流器断开时并且耗用流量超过特定阈值时会触发此事件,阈值通过配置文件general.flowThreshold配置;此事件对回复不敏感。
 | 
 |  |  |     *  
 | 
 |  |  | 
 |  |  |    @ResponseBody
 | 
 |  |  |    @PostMapping(value = "/on_flow_report", produces = "application/json;charset=UTF-8")
 | 
 |  |  |    public ResponseEntity<String> onFlowReport(@RequestBody JSONObject json){
 | 
 |  |  | 		 | 
 |  |  |       if (logger.isDebugEnabled()) {
 | 
 |  |  |          logger.debug("ZLM HOOK on_flow_report API调用,参数:" + json.toString());
 | 
 |  |  |       }
 | 
 |  |  | 
 | 
 |  |  |       logger.debug("ZLM HOOK on_flow_report API调用,参数:" + json.toString());
 | 
 |  |  |       // TODO Auto-generated method stub
 | 
 |  |  | 
 | 
 |  |  | 		 | 
 |  |  |       JSONObject ret = new JSONObject();
 | 
 |  |  |       ret.put("code", 0);
 | 
 |  |  |       ret.put("msg", "success");
 | 
 |  |  | 
 |  |  |       }
 | 
 |  |  |       String app = json.getString("app");
 | 
 |  |  |       String streamId = json.getString("id");
 | 
 |  |  | //      String ssrc = String.format("%10d", Integer.parseInt(streamId, 16)); // ZLM 要求大写且首位补零
 | 
 |  |  |       String ssrc = new DecimalFormat("0000000000").format(Integer.parseInt(streamId, 16));
 | 
 |  |  |       StreamInfo streamInfo = storager.queryPlayBySSRC(ssrc);
 | 
 |  |  |       if ("rtp".equals(app) && streamInfo != null ) {
 | 
 |  |  |          MediaServerConfig mediaInfo = storager.getMediaInfo();
 | 
 |  |  |          streamInfo.setFlv(String.format("http://%s:%s/rtp/%s.flv", mediaInfo.getLocalIP(), mediaInfo.getHttpPort(), streamId));
 | 
 |  |  |          streamInfo.setWs_flv(String.format("ws://%s:%s/rtp/%s.flv", mediaInfo.getLocalIP(), mediaInfo.getHttpPort(), streamId));
 | 
 |  |  |          streamInfo.setRtmp(String.format("rtmp://%s:%s/rtp/%s", mediaInfo.getLocalIP(), mediaInfo.getRtmpPort(), streamId));
 | 
 |  |  |          streamInfo.setHls(String.format("http://%s:%s/rtp/%s/hls.m3u8", mediaInfo.getLocalIP(), mediaInfo.getHttpPort(), streamId));
 | 
 |  |  |          streamInfo.setRtsp(String.format("rtsp://%s:%s/rtp/%s", mediaInfo.getLocalIP(), mediaInfo.getRtspPort(), streamId));
 | 
 |  |  |          storager.startPlay(streamInfo);
 | 
 |  |  |       }
 | 
 |  |  | 
 | 
 |  |  |       ZLMHttpHookSubscribe.Event subscribe = this.subscribe.getSubscribe(ZLMHttpHookSubscribe.HookType.on_publish, json);
 | 
 |  |  |       if (subscribe != null) subscribe.response(json);
 | 
 |  |  | 
 | 
 |  |  | 
 | 
 |  |  |       // TODO Auto-generated method stub
 | 
 |  |  |       
 | 
 |  |  | 
 |  |  |       if (logger.isDebugEnabled()) {
 | 
 |  |  |          logger.debug("ZLM HOOK on_shell_login API调用,参数:" + json.toString());
 | 
 |  |  |       }
 | 
 |  |  |       // TODO Auto-generated method stub
 | 
 |  |  | 		 | 
 |  |  |       // TODO 如果是带有rtpstream则开启按需拉流
 | 
 |  |  |       String app = json.getString("app");
 | 
 |  |  |       String stream = json.getString("stream");
 | 
 |  |  | 
 | 
 |  |  |       ZLMHttpHookSubscribe.Event subscribe = this.subscribe.getSubscribe(ZLMHttpHookSubscribe.HookType.on_publish, json);
 | 
 |  |  |       if (subscribe != null) subscribe.response(json);
 | 
 |  |  | 
 | 
 |  |  |       JSONObject ret = new JSONObject();
 | 
 |  |  |       ret.put("code", 0);
 | 
 |  |  |       ret.put("msg", "success");
 | 
 |  |  | 
 |  |  |       String app = json.getString("app");
 | 
 |  |  |       String streamId = json.getString("stream");
 | 
 |  |  |       boolean regist = json.getBoolean("regist");
 | 
 |  |  | //      String ssrc = String.format("%10d", Integer.parseInt(streamId, 16)); // ZLM 要求大写且首位补零
 | 
 |  |  |       String ssrc = new DecimalFormat("0000000000").format(Integer.parseInt(streamId, 16));
 | 
 |  |  |       StreamInfo streamInfo = storager.queryPlayBySSRC(ssrc);
 | 
 |  |  |       StreamInfo streamInfo = redisCatchStorage.queryPlayByStreamId(streamId);
 | 
 |  |  |       if ("rtp".equals(app) && !regist ) {
 | 
 |  |  |          storager.stopPlay(streamInfo);
 | 
 |  |  |          if (streamInfo!=null){
 | 
 |  |  |             redisCatchStorage.stopPlay(streamInfo);
 | 
 |  |  |             storager.stopPlay(streamInfo.getDeviceID(), streamInfo.getChannelId());
 | 
 |  |  |          }else{
 | 
 |  |  |             streamInfo = redisCatchStorage.queryPlaybackByStreamId(streamId);
 | 
 |  |  |             redisCatchStorage.stopPlayback(streamInfo);
 | 
 |  |  |          }
 | 
 |  |  |       }
 | 
 |  |  | 
 | 
 |  |  | 
 | 
 |  |  | 
 |  |  |          logger.debug("ZLM HOOK on_stream_none_reader API调用,参数:" + json.toString());
 | 
 |  |  |       }
 | 
 |  |  |       
 | 
 |  |  |       BigInteger bigint=new BigInteger(json.getString("stream"), 16);
 | 
 |  |  |       int numb=bigint.intValue();
 | 
 |  |  |       String ssrc = String.format("%010d", numb);  | 
 |  |  | 		 | 
 |  |  |       cmder.streamByeCmd(ssrc);
 | 
 |  |  |       String streamId = json.getString("stream");
 | 
 |  |  | 
 | 
 |  |  |       cmder.streamByeCmd(streamId);
 | 
 |  |  |       StreamInfo streamInfo = redisCatchStorage.queryPlayByStreamId(streamId);
 | 
 |  |  |       if (streamInfo!=null){
 | 
 |  |  |          redisCatchStorage.stopPlay(streamInfo);
 | 
 |  |  |          storager.stopPlay(streamInfo.getDeviceID(), streamInfo.getChannelId());
 | 
 |  |  |       }else{
 | 
 |  |  |          streamInfo = redisCatchStorage.queryPlaybackByStreamId(streamId);
 | 
 |  |  |          redisCatchStorage.stopPlayback(streamInfo);
 | 
 |  |  |       }
 | 
 |  |  |       
 | 
 |  |  |       JSONObject ret = new JSONObject();
 | 
 |  |  |       ret.put("code", 0);
 | 
 |  |  | 
 |  |  |          logger.debug("ZLM HOOK on_stream_not_found API调用,参数:" + json.toString());
 | 
 |  |  |       }
 | 
 |  |  |       // TODO Auto-generated method stub
 | 
 |  |  | 		 | 
 |  |  | 
 | 
 |  |  |       if (autoApplyPlay) {
 | 
 |  |  |          String app = json.getString("app");
 | 
 |  |  |          String streamId = json.getString("stream");
 | 
 |  |  |             StreamInfo streamInfo = redisCatchStorage.queryPlayByStreamId(streamId);
 | 
 |  |  |          if ("rtp".equals(app) && streamId.indexOf("gb_play") > -1 && streamInfo == null) {
 | 
 |  |  |             String[] s = streamId.split("_");
 | 
 |  |  |             if (s.length == 4) {
 | 
 |  |  |                String deviceId = s[2];
 | 
 |  |  |                String channelId = s[3];
 | 
 |  |  |                Device device = storager.queryVideoDevice(deviceId);
 | 
 |  |  |                if (device != null) {
 | 
 |  |  |                   UUID uuid = UUID.randomUUID();
 | 
 |  |  |                   cmder.playStreamCmd(device, channelId, (JSONObject response) -> {
 | 
 |  |  |                      logger.info("收到订阅消息: " + response.toJSONString());
 | 
 |  |  |                      playService.onPublishHandlerForPlay(response, deviceId, channelId, uuid.toString());
 | 
 |  |  |                   }, null);
 | 
 |  |  |                }
 | 
 |  |  | 
 | 
 |  |  |             }
 | 
 |  |  | 
 | 
 |  |  |          }
 | 
 |  |  | 
 | 
 |  |  |       }
 | 
 |  |  | 
 | 
 |  |  |       JSONObject ret = new JSONObject();
 | 
 |  |  |       ret.put("code", 0);
 | 
 |  |  |       ret.put("msg", "success");
 | 
 |  |  | 
 |  |  | //      List<MediaServerConfig> mediaServerConfigs = JSON.parseArray(JSON.toJSONString(json), MediaServerConfig.class);
 | 
 |  |  | //      MediaServerConfig mediaServerConfig = mediaServerConfigs.get(0);
 | 
 |  |  |       MediaServerConfig mediaServerConfig = JSON.toJavaObject(json, MediaServerConfig.class);
 | 
 |  |  |       storager.updateMediaInfo(mediaServerConfig);
 | 
 |  |  |       mediaServerConfig.setWanIp(StringUtils.isEmpty(mediaWanIp)? mediaIp: mediaWanIp);
 | 
 |  |  |       mediaServerConfig.setLocalIP(mediaIp);
 | 
 |  |  |       redisCatchStorage.updateMediaInfo(mediaServerConfig);
 | 
 |  |  |       // TODO Auto-generated method stub
 | 
 |  |  |       
 | 
 |  |  |       JSONObject ret = new JSONObject();
 |