[视频汇聚]如何用Java服务转发视频流

背景

在一些项目中需要调用摄像机实时播放连接,如果在没有人观看的情况下VMS一直推流会占用带宽有效的解决方案就是通过其他服务进行转发流地址进行播放

  1. 首先播放器请求后端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);
    }
  1. 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);
            }
  1. 调用底层接口成功后进行流转发此时的流是可以播放的
 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);
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 1
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值