姓名:许立;学号:21011210048;学院:通信工程学院
【嵌牛导读】对接海康威视的摄像头,在官网下载了sdk开发包,心里还想这个应该不会太难,毕竟海康也算大公司,各种对接方式应该都是成熟的,打开sdk包里面还是挺齐全的MFC、java、c#都有,依次调试里一下,都能对接成功,不过不是我想要web方式对接,都是C/S架构的,我想要的是B/S方式对接。
【嵌牛鼻子】海康威视视频控件
【嵌牛提问】看完本文你有没有动手试试呢
【嵌牛正文】
运行环境与设备支持:
海康控件开发包链接:
32位浏览器:
https://pan.baidu.com/s/160ia40-hlFd1MynbxSBI2Q 密码:d3pf
64位浏览器:
https://pan.baidu.com/s/1TbNHqfZSw9PPS4Z-xYvcoQ 密码:38qq
Web控件V3.0基于ActiveX和NPAPI开发,接口封装于JavaScript脚本,以JavaScript接口形式提供用户集成,支持网页上实现预览、回放、云台控制等功能。该控件仅支持B/S开发,不适用C/S开发。
Web控件V3.0支持多种我司设备,包括DVR、NVR、DVS、网络摄像机、网络球机等,设备需要支持PSIA或ISAPI协议。
该控件所需运行环境:
操作系统:WindowsXP、Windows7、Windows8、Windows8.1(实际上目前Windows10也可以用)
浏览器:
IE8~IE11、Chrome31+、Firefox35+,32位浏览器
IE8~IE11、Chrome31~Chrome44、Firefox35~Firefox51,64位浏览器
(ps:这里其实有很大的坑,浏览器一旦版本位数没有和插件对上,页面显示就会有问题,很多人没看清这点盲目上手就踩在了这一点上)
HTTPS播放需要开启Websockets
首先要开启https,并且要启用Websockets(否则会因为wss连接不成功而提示预览失败,这个卡了我很久最终领导试的时候才发现的,这玩意不放在一起真是坑死我了。),然后可以通过https来访问摄像头正常播放了:
WEB无插件SDK开发时发现wss播放异常
WEB无插件SDK本质就是在中间多加一个nginx进行转发,nginx通过请求中的Cookie找到摄像头的IP地址进行转发(海康通过这种cookie值来跳转还是蛮新奇的,我还第一次见这种操作):
开发时,我使用的是21年9月份的版本(WEB无插件开发包_20210918_20210922140917),http/ws播放正常,而https/wss播放是有问题的,经过修改了部分SDK的代码(经过压缩过的代码改起来是蛮麻烦的),终于连上去了。但经修改后的wss直接连接的是摄像头的地址而不是nginx地址导致了证书问题,会提示failed: Error in connection establishment:net::ERR_CERT_AUTHORITY_INVALID(这里我使用的chrome只会提示failed:,用Edge才有完整的错误提示,这个也坑了我好久,之前我一直瞎尝试,用了Edge才发现真正的问题。 ),搜了一下是自签名证书会存在的问题,需要先让浏览器https访问摄像头让浏览器允许这个证书才能正常wss连接。(测试期间,发现我的电脑能播放,其它人的电脑不能播放,定位了大半天才发现原来是这个问题)
虽然我改了SDK源代码来实现播放,但还是没达到真正的效果,真正的效果应该是wss连接nginx,而不是直连摄像头,这才能避开自签名证书不能播放问题以及网段不同时不能直连摄像头的问题。
海康威视开发下载包,最新的版本是10月份的,仍然是无法播放HTTPS的,估计还没开发完。(而且这个版引入了新BUG,设置窗口大小无法传入百分比。)
过完年后,试试看能不能绕过,本来我是想着海康的BUG让海康自己去修,我等待官方更新就好了,但就是现在想要搞出来,不要拖,所以只能继续尝试。经过再次尝试,将原本wss直连摄像头的那部分代码改成指向nginx,一开始连不上,经过对比Cookie发现是里面的值错了,再次修改便成功了。nginx的配置如下:
server {
listen 443 ssl;
server_name www.test.com;
ssl_certificate 6749255_www.test.com.pem;
ssl_certificate_key 6749255_www.test.com.key;
ssl_ciphers ECDHE-RSA-AES128-GCM-SHA256:ECDHE:ECDH:AES:HIGH:!NULL:!aNULL:!MD5:!ADH:!RC4;
ssl_protocols TLSv1 TLSv1.1 TLSv1.2;
ssl_prefer_server_ciphers on;
location / {
root "D:\test";
index index.html index.htm;
}
location ~ /ISAPI|SDK/ {
proxy_set_header 'sec-ch-ua' "";
proxy_set_header 'sec-ch-ua-mobile' "";
proxy_set_header 'sec-ch-ua-platform:' "";
proxy_set_header 'Sec-Fetch-Dest' "";
proxy_set_header 'Sec-Fetch-Mode' "";
proxy_set_header 'Sec-Fetch-Site' "";
if ($http_cookie ~ "webVideoCtrlProxy=(.+)") {
proxy_pass https://$cookie_webVideoCtrlProxy;
break;
}
}
location ^~ /webSocketVideoCtrlProxy {
#web socket
proxy_http_version 1.1;
proxy_set_header Upgrade $http_upgrade;
proxy_set_header Connection "upgrade";
proxy_set_header Host $host;
if ($http_cookie ~ "webVideoCtrlProxyWss=(.+)") {
proxy_pass https://$cookie_webVideoCtrlProxyWss/$cookie_webVideoCtrlProxyWsChannel?$args;
break;
}
}
}