一、 背景
由于海康安防平台部署在电站基础层,在分公司侧需要访问各个厂站视频平台,初步思路是在分公司侧部署一个代理(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
说明: 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