package com.ld.igds.protocol.fzmedia; import com.alibaba.fastjson.JSONObject; import com.ld.igds.camera.CameraUtil; import com.ld.igds.camera.data.ApiCameraData; import com.ld.igds.camera.data.ApiCameraResp; import com.ld.igds.camera.data.ApiSnapReq; import com.ld.igds.protocol.snap.SnapPluginService; import com.ld.igds.sec.dto.SecCameraDto; import com.ld.igds.camera.ApiCameraService; import lombok.extern.slf4j.Slf4j; import org.apache.commons.lang3.StringUtils; import org.springframework.beans.factory.annotation.Autowired; import org.springframework.http.ResponseEntity; import org.springframework.stereotype.Component; import org.springframework.web.client.RestTemplate; import java.util.HashMap; import java.util.List; import java.util.Map; /** * 风正致远自有流媒体服务器 */ @Slf4j @Component public class FzzyMediaService implements ApiCameraService { private static String URL_PLAY = "http://ip:port/api/v1/remote/play"; public static String URL_PTZ = "http://ip:port/api/v1/remote/ptz"; // http://124.71.187.17:15080/rtp/ private static String URL_PLAY_FLV = "http://ip:15080/rtp/sn_channel.flv"; @Autowired private SnapPluginService snapPluginService; @Autowired private FzzyProp prop; @Autowired private RestTemplate restTemplate; @Override public String getPlayType() { return CameraUtil.PLAY_TYPE_FZZY_GB; } @Override public ApiCameraResp getPlayAddr(ApiCameraData apiCameraDto) { try { String mediaIp = prop.getIp(); if (null == mediaIp) { log.warn("-----------没有获取到多媒体服务地址-----"); return new ApiCameraResp(ApiCameraResp.CODE_ERROR, "没有获取到多媒体服务地址"); } String sn = apiCameraDto.getSn(); String ipTag = apiCameraDto.getIp(); URL_PLAY = URL_PLAY.replace("ip", mediaIp).replace("port", prop.getPort() + ""); String url = URL_PLAY + "?sn={sn}&channel={channel}&ip={ip}"; String channel = sn; if (sn.indexOf("_") > 0) { channel = sn.substring(sn.indexOf("_") + 1); sn = sn.substring(0, sn.indexOf("_")); } log.info("-------获取多媒体播放信息---------URL-{}", url); Map map = new HashMap<>(); map.put("sn", sn); map.put("channel", channel); map.put("ip", ipTag); ResponseEntity responseEntity = restTemplate .getForEntity(url, JSONObject.class, map); JSONObject result = responseEntity.getBody(); // 自己封装 String flv = URL_PLAY_FLV; flv = flv.replace("ip", mediaIp) .replace("port", prop.getPort()+"") .replace("sn", sn).replace("channel", channel); result.put("flv", flv); log.info("-------获取多媒体播放信息---------result-{}", result); return new ApiCameraResp((String) result.get("code"), (String) result.get("flv"), (String) result.get("msg")); } catch (Exception e) { log.debug("调用流媒体服务器异常:{}", e); return new ApiCameraResp(ApiCameraResp.CODE_ERROR, "调用流媒体服务器异常:请联系管理员查看原因"); } } /** * 云台控制 *

* 执行命令 1=上,2=下,3=左,4=右,5=左上,6=左下,7=右上,8=右下,0=停止,9=变倍小,10 = 变倍加 * * @param dto * @return */ @Override public ApiCameraResp ptzMedia(ApiCameraData dto) { if (StringUtils.isEmpty(dto.getSn()) && StringUtils.isEmpty(dto.getIp())) { return new ApiCameraResp(ApiCameraResp.CODE_ERROR, "没有获取到当前摄像机IP/SN,不支持云台控制"); } try { String mediaIp = prop.getIp(); if (null == mediaIp) { log.warn("-----------没有获取到多媒体服务地址-----"); return new ApiCameraResp(ApiCameraResp.CODE_ERROR, "没有获取到多媒体服务地址"); } URL_PTZ = URL_PTZ.replace("ip", mediaIp).replace("port", prop.getPort()+""); String url = URL_PTZ + "?sn={sn}&channel={channel}&ip={ip}&command={command}"; log.debug("-------调用流媒体PTZ路径---------URL-{}", url); // 命令进行转换 控制指令 允许值: left, right, up, down, upleft, upright, // downleft, downright, zoomin, zoomout, stop if ("1".equals(dto.getCommand())) { dto.setCommand("up"); } if ("2".equals(dto.getCommand())) { dto.setCommand("down"); } if ("3".equals(dto.getCommand())) { dto.setCommand("left"); } if ("4".equals(dto.getCommand())) { dto.setCommand("right"); } if ("5".equals(dto.getCommand())) { dto.setCommand("upleft"); } if ("6".equals(dto.getCommand())) { dto.setCommand("downleft"); } if ("7".equals(dto.getCommand())) { dto.setCommand("upright"); } if ("8".equals(dto.getCommand())) { dto.setCommand("downright"); } if ("9".equals(dto.getCommand())) { dto.setCommand("zoomin"); } if ("10".equals(dto.getCommand())) { dto.setCommand("zoomout"); } if ("0".equals(dto.getCommand())) { dto.setCommand("stop"); } String sn = dto.getSn(); String channel = sn; if (sn.indexOf("_") > 0) { channel = sn.substring(sn.indexOf("_") + 1); sn = sn.substring(0, sn.indexOf("_")); dto.setSn(sn); dto.setChannel(channel); } Map map = new HashMap<>(); map.put("sn", dto.getSn()); map.put("channel", dto.getChannel()); map.put("ip", dto.getIp()); map.put("command", dto.getCommand()); ResponseEntity responseEntity = restTemplate .getForEntity(url, JSONObject.class, map); JSONObject result = responseEntity.getBody(); log.info("-------调用流媒体PTZ路径---执行-{}--result-{}", dto.getCommand(), result); return new ApiCameraResp((String) result.get("code"), (String) result.get("msg")); } catch (Exception e) { log.error("调用流媒体服务器异常:{}", e); return new ApiCameraResp(ApiCameraResp.CODE_ERROR, "调用流媒体服务器异常:请联系管理员查看原因"); } } @Override public ApiCameraResp ptzPreset(ApiCameraData apiCameraDto) { //TODO return null; } @Override public ApiCameraResp keepAlive(ApiCameraData apiCameraDto) { //TODO return null; } @Override public List searchCamera(ApiCameraData apiCameraDto) { //TODO return null; } @Override public ApiCameraResp snapImg(ApiSnapReq apiCameraDto) { if (CameraUtil.SNAP_TYPE_FZZY_PLUGIN.equals(apiCameraDto.getSnapType())) { return snapPluginService.snapImg(apiCameraDto); } return null; } }