海康平台通过代理播放视频流

0 阅读1分钟

一、 背景

由于海康安防平台部署在电站基础层,在分公司侧需要访问各个厂站视频平台,初步思路是在分公司侧部署一个代理(nginx)到每个厂站的安防平台地址。

二、nginx配置信息

location /media {
        # 关键:保留原始Upgrade头(不要硬编码)
        proxy_pass http://10.77.255.80:559;
        proxy_http_version 1.1;
        proxy_set_header Upgrade $http_upgrade;  # 必须用变量
        proxy_set_header Connection "upgrade";
        # 海康强制要求
        proxy_set_header Origin "";
        proxy_set_header Referer "";
        proxy_set_header Host $host;  # 先试这个,失败再改后端IP
        
        # 超时
        proxy_read_timeout 3600s;
        proxy_send_timeout 3600s;
        
        # 实时流
        proxy_buffering off;
        proxy_request_buffering off;
    }
       location ~ ^/10\.77\.255\.80:559(/openUrl/.+)$ {
        rewrite ^/10\.77\.255\.80:559(/openUrl/.+)$ $1 break;
        proxy_pass http://10.77.255.80:559;
        proxy_set_header Host $host;
        proxy_set_header X-Real-IP $remote_addr;
        proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
        proxy_set_header X-Forwarded-Proto $scheme;
        proxy_set_header Origin "";
        proxy_set_header Referer "";
        proxy_http_version 1.1;
        proxy_set_header Upgrade $http_upgrade;
        proxy_set_header Connection "upgrade";
        proxy_read_timeout  3600s;
        proxy_buffering off;
    }

通过以上配置信息,可以将ws连接信息代理到http://10.77.255.80:559安防平台地址,详情代理地址如下: var playURL = 'ws://10.77.255.86:7500/proxy/10.77.255.80:559/openUrl/nsig7voWGA2WcKjl2SeDWRqHfaYU1pX31ZKw' 说明:10.77.255.86:7500: 该地址为nginx代理信息。

代理地址media海康认证地址,样例地址如下:

ws://10.77.255.86:7500/media?version=0.1&cipherSuites=0&sessionID=

三、前端播放器(H5Player)

资源下载地址: https://open.hikvision.com/download/5c67f1e2f05948198c909700?type=20

image.png

说明: H5player已实现自动认证机制,将地址ws://10.77.255.86:7500/proxy/10.77.255.80:559/openUrl/nsig7voWGA2WcKjl2SeDWRqHfaYU1pX31ZKw放入H5Player中,将自动完成认证和视频预览播放。

四 JAVA返回直播流地址

    HashMap<String, Object> returnMap = new HashMap<String,Object>();
       try {
          String terminalfullcode = codeCameraindexcodePageDto.getTerminalfullcode();
          String stationcode = terminalfullcode.substring(0,8);
          CodeIpstationinfo codeIpstationinfo = codeIpstationinfoMapper.getIPAndPort(stationcode);

          String CameraIndexCode = codeCameraindexcodePageDto.getCameraIndexCode();
//     码流类型
          int mllx = Integer.parseInt(codeCameraindexcodePageDto.getStreamType());
//     取流协议(应用层协议)
          int Transmode = Integer.parseInt(codeCameraindexcodePageDto.getTransmode());
          requestuse = new PreviewURLsRequest();
          requestuse.setCameraIndexCode(CameraIndexCode);
          requestuse.setExpand("transcode=0");
           //wss 支持https,用于正式环境,ws 内网测试,用于http
          requestuse.setProtocol("ws");
          requestuse.setStreamform("ps");
          requestuse.setTransmode(Transmode);
          requestuse.setStreamType(mllx);
          String rtspDz = ArtemisPostTest_URLv2.previewURLs(requestuse,codeIpstationinfo);
          System.out.println("rtspDz::"+rtspDz);
          JSONObject rtspJson = JSON.parseObject(rtspDz);
          String rtspdata = rtspJson.get("data").toString();
          JSONObject rtspDataJson = JSON.parseObject(rtspdata);
          String rtspUrl = rtspDataJson.get("url").toString();
          System.out.println("resultRtsp:"+rtspUrl);

          //{
          //    "rtspUrl": "wss://10.77.255.80:6014/proxy/10.77.255.80:559/openUrl/nsigKexHc0NC4pg3zJ773RzqP2xkqqTYLfNm"
          //}
//        String substring = rtspUrl.substring(rtspUrl.indexOf("openUrl")+8, rtspUrl.length());
//        rtspUrl="ws://10.77.255.86:7500/"+substring;
          String substring =rtspUrl.substring(5);
          rtspUrl="ws://10.77.255.86:7500/proxy/"+substring;
          System.out.println("resultRtsp-guoxx:"+rtspUrl);
          returnMap.put("rtspUrl",rtspUrl);

返回地址

{
 "rtspUrl": "wss://10.77.255.80:6014/proxy/10.77.255.80:559/openUrl/nsigKexHc0NC4pg3zJ773RzqP2xkqqTYLfNm"
}

四、致谢

感谢其他博客提供的技术思路,参考博客地址:https://knowbot.hikvision.com/upload/web/145716889796196/20240412/42811712910187584.pdf