背景
在一些项目中需要调用摄像机实时播放连接,如果在没有人观看的情况下VMS一直推流会占用带宽有效的解决方案就是通过其他服务进行转发流地址进行播放
- 首先播放器请求后端Java接口
@RequestMapping(value = "/getPlayMsgV2")
public void getPlayMsg(HttpServletRequest request, HttpServletResponse response, @RequestParam String deviceChannelId, @RequestParam Integer streamKind, @RequestParam String type) throws ServletException, IOException {
// 判断是否是VCELL 设备
DeviceChannel deviceChannel = deviceChannelService.getById(deviceChannelId);
Assert.notNull(deviceChannel, "未查询到设备通道");
ResultEntity realPlayUrl = deviceChannelService.getRealPlayUrl(deviceChannelId, streamKind);
Assert.isTrue(realPlayUrl.isSuccess(), realPlayUrl.getMsg());
Map<String, Object> data = (Map<String, Object>) realPlayUrl.getData();
String URL = data.get(type) + "";
request.getRequestDispatcher(URL).forward(request,response);
}
- Java会调用底层的获取流地址进行取流未经调用的流地址无法播放
try {
Map map = new HashMap();
map.put("version",0);
map.put("kind",0);
map.put("sessionId", UUIDUtils.getLCUUID());
map.put("time", (int)(System.currentTimeMillis()/1000));
map.put("mediaSvrPort", softServer.getTcpPort());
Map<String, Object> params = new HashMap<>();
Map<String, Object> param = new HashMap<>();
param.put("deviceId",device.getDeviceId());
if (device.getType()==2){//网关传网关通道id
param.put("channelId",deviceChannel.getGatewayChannelId());
}else{//其他传通道索引
param.put("channelIndex",deviceChannel.getChannelIndex());
}
param.put("streamKind",streamCode);
List data = new ArrayList();
data.add(param);
params.put("data",data);
map.put("params",params);
String res = HttpUtils.doPostJson(String.format(QuLinkConstants.MEDIA_URL_GETREALSTREAM,hardwareServer.getTcpIp()), JacksonUtils.objectToJson(map));
//{"version":0,"kind":1,"sessionId":"4d17a970d1ac469698f766e6c7273ec3","api":"","time":1647587874,"params":{"code":1,"msg":"OK"}}
Map resMap = JacksonUtils.jsonToMap(res);
Map p = (Map) resMap.get("params");
int code = (int) p.get("code");
if (code != 1) {
return ResultEntity.fail((String) p.get("msg"));
}else{//成功
//流id
String streamId ="";
if (device.getType()==2){
streamId = device.getDeviceId()+"_"+deviceChannel.getGatewayChannelId()+"_"+streamCode;
}else{
streamId = device.getDeviceId()+"_"+deviceChannel.getChannelIndex()+"_"+streamCode;
}
resMap = new HashMap();
resMap.put("streamId",streamId);
resMap.put("http-flv",String.format(QuLinkConstants.MEDIA_URL_FLV,hardwareServer.getTcpIp(),hardwareServer.getTcpHttpPort(),streamId));
resMap.put("http-hls",String.format(QuLinkConstants.MEDIA_URL_HLS,hardwareServer.getTcpIp(),hardwareServer.getTcpHttpPort(),streamId));
resMap.put("ws-flv",String.format(QuLinkConstants.MEDIA_URL_WSFLV,hardwareServer.getTcpIp(),hardwareServer.getTcpHttpPort(),streamId));
resMap.put("ws-hls",String.format(QuLinkConstants.MEDIA_URL_WSHLS,hardwareServer.getTcpIp(),hardwareServer.getTcpHttpPort(),streamId));
resMap.put("rtsp",String.format(QuLinkConstants.MEDIA_URL_RTSP,hardwareServer.getTcpIp(),hardwareServer.getTcpRtspPort(),streamId));
resMap.put("rtmp",String.format(QuLinkConstants.MEDIA_URL_RTMP,hardwareServer.getTcpIp(),hardwareServer.getTcpRtmpPort(),streamId));
return ResultEntity.data(resMap);
}
- 调用底层接口成功后进行流转发此时的流是可以播放的
ResultEntity realPlayUrl = deviceChannelService.getRealPlayUrl(deviceChannelId, streamKind);
Assert.isTrue(realPlayUrl.isSuccess(), realPlayUrl.getMsg());
Map<String, Object> data = (Map<String, Object>) realPlayUrl.getData();
String URL = data.get(type) + "";
request.getRequestDispatcher(URL).forward(request,response);