[视频汇聚]如何用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
    评论
Nginx-RTMP是一个基于Nginx的开源项目,它提供了一个功能强大的云服务转发RTSP视频流的解决方案。通过使用Nginx-RTMP,您可以将RTSP视频流转发到云服务器上,并通过HTTP或其他协议进行访问和播放。 以下是使用Nginx-RTMP进行RTSP视频流转发的步骤: 1. 安装Nginx-RTMP:首先,您需要在云服务器上安装Nginx-RTMP模块。您可以从Nginx-RTMP的官方网站或GitHub页面下载最新版本的源代码,并按照官方文档中的指引进行编译和安装。 2. 配置Nginx-RTMP:安装完成后,您需要编辑Nginx的配置文件,添加RTMP模块相关的配置项。您可以指定要监听的端口、转发规则、推流地址等。具体的配置方式可以参考Nginx-RTMP的官方文档。 3. 启动Nginx-RTMP:配置完成后,您可以启动Nginx-RTMP服务,并确保服务正常运行。您可以使用命令行或者系统服务管理工具来启动和停止Nginx-RTMP。 4. 转发RTSP视频流:一旦Nginx-RTMP服务正常运行,您可以使用RTSP协议将视频流推送到云服务器上。您可以使用常见的RTSP推流工具,如FFmpeg或OBS Studio,将本地的RTSP视频流推送到Nginx-RTMP服务器。 5. 访问和播放视频流:一旦视频流被成功推送到Nginx-RTMP服务器,您可以通过HTTP或其他协议访问和播放视频流。您可以使用常见的视频播放器,如VLC媒体播放器或HTML5视频播放器,通过指定Nginx-RTMP服务器的地址和端口来播放视频流。 希望以上介绍对您有帮助!如果您有任何进一步的问题,请随时提问。
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值