公司新装了不少海康威视摄像头,通过NVR连接到了萤石云,由于萤石云免费版限制了单个摄像头的并发访问数(每个摄像头同时只允许4个用户进行查看实时视频),但是又不想付费购买企业版,于是着手思考如何解决这个问题。
解决方案思考
需求
需求很明确,每个摄像头需要支持多用户同时播放实时视频(并发可能大于四)
方案
1、通过海康提供的SDK,在摄像头挂载的局域网内直接获取视频流推送到自己的服务器进行直播,绕过萤石云。
2、将自有服务器作为唯一访问客户端,拉取视频流再进行分发。
方案一需要比较大的开发量,并且摄像头已经部署好,网络环境未知,还需要在本地准备一台服务端主机用来推流,且由于用户访问视频可能是随时的,需要24h不间断推送,对服务器压力也比较大,方案二更简单,因此选择第二种作为实现。
实现
方案验证
本机使用wsl2
ubuntu16.04
进行测试
1、安装ffmpeg
sudoadd-apt-repositoryppa:kirillshkrogalev/ffmpeg-nextsudoapt-getupdatesudoapt-getinstallffmpeg
2、源码编译nginx
,并添加nginx-rtmp
插件
#安装gccg的依赖库sudoapt-getinstallbuild-essentialsudoapt-getinstalllibtool#安装pcre依赖库sudoapt-getupdatesudoapt-getinstalllibpcre3libpcre3-dev#安装zlib依赖库sudoapt-getinstallzlib1g-dev#安装SSL依赖库sudoapt-getinstallopenssllibssl-dev#安装nginx,先安装nginx再添加流媒体插件编译wgethttp://nginx.org/download/nginx-1.9.8.tar.gztar-zxvfnginx-1.9.8.tar.gzcdnginx-1.9.8./configure--prefix=/usr/local/nginx#编译、安装:makesudomakeinstall#下载rtmp流媒体插件wgethttps://github.com/arut/nginx-rtmp-module/archive/master.zip#用unzip解压,如果没有unzip,请安装sudoapt-getinstallunzipunzipmaster.zip#解压好插件后再回到nginx源码的解压目录里面,将插件配置进去,注意nginx-rtmp-module-master的相对路径!!!!./configure--with-http_ssl_module--add-module=./nginx-rtmp-module-master#再次编译安装makesudomakeinstall#将nginx注册到服务sudowgethttps://raw.github.com/JasonGiedymin/nginx-init-ubuntu/master/nginx-O/etc/init.d/nginxsudochmodx/etc/init.d/nginxsudoupdate-rc.dnginxdefaults
配置nginx流媒体服务
编辑配置文件
vim/usr/local/nginx/conf/nginx.conf
加入一段配置,wq保存
#配置到根节点下,不要包含在http中rtmp{server{listen1935;#流媒体服务端口chunk_size4096;#直播流后缀起始路径rtmp://x.x.x.x:1935/live/****applicationlive{liveon;#recordoff;}}}
重启nginx
即可
2、通过萤石云获取摄像头RTMP临时授权链接
3、进行流转播
ffmpeg-i"rtmp://rtmp01open.ys7.com:1935/v3/openlive/J17103688_2_1?expire=1671692735&id=3961899259904&t=82f2e5cfce043534db5165ca1d5f58498781f148fb2c4fb249f&ev=100"-vcodeccopy-acodeccopy-fflvrtmp://localhost:1935/live/test
-i
参数后面为萤石云流地址
4、使用VLC
播放工具测试
重复打开多次VLC
,按此步骤播放视频流即可
可以看到,视频访问并未受并发限制?
功能完善
1、当前验证了方案的可行性,由于萤石云流链接会失效,所以要配合开放平台的API进行定期更新拉流服务。
2、视频流在自建服务器上的推流地址也不应设置为固定,推流服务的推送路径应当定期更新,例如../live/{摄像头编号}/{token}
,token设置时效性防止视频流被恶意扒取。
3、为避免长期占用服务器下行带宽,应当处理每个摄像头在无任何用户查看视频时切断于萤石云的视频流连接,可以在前端通过websocket
或者http轮询
来监测用户视频访问,一定程度上也安全性也提高了。