最近项目用到了一个调用海康威视摄像头实现外网网页预览的需求,由于第一次接触这类需求,不免有些焦头烂额,现终于将需求实现,故,作一笔记用于记忆,并希望帮到要用的人。废话不多说,直接开始:
整理了一下整个流程,共分以下四个步骤:
1.使用海康威视的官方SDK访问摄像头,获取摄像头可用通道号,组装rtsp地址,获取摄像头的实时rtsp视频流。
注1:12年之后海康设备支持两种组装rtsp流的方式,可以不使用通道号就可以,故此步可以省略;
注2:如果不使用通道,使用量多的话会影响画质,故,推荐使用通道号组装rtsp地址;
2.使用FFmpeg将rtsp流转换成rtmp流供网页显示。
注1:FFmpeg支持转mp4,webm,ogg等多种前言音视频文件的格式转换哦;
注2:本文使用rtmp流,有其他需求的小伙伴可以使用FFmpeg转成其他格式;
3.服务器搭建集成nginx-rtmp插件的nginx服务,将转换的rtmp流推送至nginx制定代理地址,实现外网访问。
注1:建议有能力的公司使用单独服务器搭建流媒体服务器哦。
4.前端页面使用免费的前端H5插件video.js实现实时预览
注1:video.js支持mp4,webm,ogg三种格式的文件的播放。
注2:rtmp流属于flv格式只能用flash播放,故需要flash插件支持;
注3:video.js只有一些版本支持flash,故,要选好版本(本文使用的是v5.20.5);
1.下载海康威视的最新SDK;海康威视官方SDK下载;
自己选择适合自己环境的SDK下载
2.下载之后解压,目录如下:
Demo示例中的是几种开发语言的demo,其中java的是用swing写客户端,C/S架构的,可以参考。
库文件中是需要使用的dll运行库;是需要引进项目中的。那个txt文件里说了,有几个文件和文件夹
是必须的:
HCNetSDK.dll、HCCore.dll、PlayCtrl.dll、SuperRender.dll、
AudioRender.dll、HCNetSDKCom文件夹
3.我个人是在项目的webapp下创建了一个libraries的文件夹专一放摄像头的库文件的,因为我除了海康,
还要调华为的高清视讯终端;(有外网链接需求的朋友,可以选择搭建一个小项目专一做流媒体服务器)
(注意:java调用dll库需要使用jna.jar)
目录如下:
4.然后在一个全局工具类里写了一个静态方法获取webapp的路径以获取dll文件的路径;
由于开发环境为内网,故只能以图片方式贴代码,大家将就看:
println中的是获取的的HCNetSdk.dll的绝对路径;
5.根据SDK压缩包里的那个txt文件所说,修改SDK文件的路径:
注:我们不用预览功能所以不用修改PlayCtrl的路径,不会调用他的;
6.编写工具类的各种方法,初始化,注册设备,获取通道:
6.1初始化环境:
6.2注册设备:
6.3获取通道:
6.4:整体调用获取通道号:
这里的注释是推流哈,这个后边再说;
先看到这句:int channelNumber = hcTools.getChannelNumber();就是获取到了通道号;
看过Demo的小伙伴看了就知道我是根据demo改的哈!
7.组装rtsp地址:
成功的rtsp地址如下:
rtsp://admin:[email protected]:554/h264/ch1/main/av_stream
解释下
admin:设备登录账号;
admin123456:设备登录密码;
10.192.44.101:设备的内网IP地址:
554:默认端口(注:不要变,这是取rtsp流的默认端口);
h264:是视频流编码格式;
ch1:通道号(注:下面会详细介绍通道号规则);
如上为一个rtsp流的格式,具体介绍见下文:
传送门:https://blog.csdn.net/qq_34845917/article/details/75077712
下文为海康威视的rtsp的规则:
传送门:https://blog.csdn.net/xiejiashu/article/details/71786187
以下为个人对于海康的通道号的理解(原文在海康SDK开发文档内,自己扒):
海康通道号分两种模拟通道和数字通道。
通道号是一个整形数字,在组装rtsp地址的时候需要加上“ch”前缀;
数字通道(即IP通道)在使用时要在获得的值的基础上加32;
以上在代码中都有实现。
现在我们就获取到了一个rtsp视频流。接下来我们测一下可以用否:
安装vlc-2.2.4-win32.exe:一直下一步。(64位系统可用);
打开vlc客户端==>媒体==>流==>网络
将得到的rtsp地址放进去,然后点击图片中串流右边的三角选播放:
成功!第一步结束!
1.下载window可用的FFmpegCommandHandler,传送门:https://blog.csdn.net/eguid_1/article/details/52968220
这里是已经用java包装好的一个FFempg的工具
2.下载后打开压缩包
选择jar文件夹下有一个jar包:FFmpegCommandHandler.jar
3.将这个jar包安装到本地的maven仓库(maven项目):
将jar包解压之文件夹然后使用 maven 的 install:install-file命令
mvn install:install-file -DgroupId=FFmpeg -DartifactId=FFmpeg -Dversion=1.0
-Dpackaging=jar -Dfile=D:\XXX\FFmpegCommandHandler.jar;
4.进入自己的本地Maven仓库找ffempg\ffempg\1.0\ffempg-1.0.pom
5.项目中pom.xml引入
6.安装FFmpeg,并配置环境变量
下载地址:https://ffmpeg.zeranoe.com/builds/
我们选择static版本
下载之后,将压缩包解压到你想安装的地方然后复制ffmpeg.exe文件所在路径,
添加至系统环境变量;
7.FFmpeg的使用
这里小伙伴们会看到rtmp://localhost:1935/live/,这是把转好的rtmp流直接推送到
流媒体服务器上的nginx服务上,因为我用的是本机做服务器,所以是localhost;
1935是nginx-rtmp的默认端口,这是下一节的事情
第二步骤结束
1.下载已经集成nginx-rtmp插件的nginx,传送门:https://github.com/illuspas/nginx-rtmp-win32
解压到指定文件夹,打开conf/nginx.conf文件
这里的live就是上边代码中的rtmp://localhost:1935/live/中的live,可以自己定义
2.启动nginx
在nginx的安装目录下按住shift键右击鼠标,点击出现菜单中的在此处打开命令行
输入命令 nginx.ece -c cong\nginx.conf 回车,nginx启动时不能关闭命令行窗口!
有时间的小伙伴可以尝试一下将nginx安装为windows系统服务,这样就可以用
net start nginx 命令启动nginx且不会有命令行窗口打开。
3.执行上文中出现的Java代码中的startTranscoding方法就可以实现推流;
这时候的推流只是将rtsp流转为rtmp流并推送至nginx中。而产生的rtmp流地址为:
rtmp://xxx.xxx.xxx.xxx:1935/live/appName
这里的xxx.xxx.xxx.xxx是流媒体所在服务器的外网ip;下面是动态获取ip的方法
这里的appName是自定义的我用的是用户账号好摄像头ip去“.”之后的组合字符串
具体效果见传送门:https://blog.csdn.net/gui66497/article/details/78590190
成功!第三步结束!
1.前端选择目前免费的H5插件:videojs;此处注意本文头部的注意事项
video.js v5.20.5 下载地址:https://github.com/videojs/video.js/releases/tag/v5.20.5
2.页面引用
注意最后一句 videojs.options.flash.swf = "../js/videojs/video-js.swf"
本文开头的时候说了由于rtmp流属于flv格式,是属于flash的专用格式。这句话的意思就是判断当前浏览器是否支持H5标准或者video.js是否支持当前格式播放,如果不支持H5或者格式不允许,则默认调用flash播放
使用完成后记得关闭推流进程,当然如果需求要保存视频,可以不用关闭,一直推送,并转换成MP4保存,关闭进程的方法在FFmpegCommandHandler的源码包里,自己看源码,我文件头步上传的附件里有关闭的代码,时间来不及了了,不写了。
OK!到此一切结束,本文先给正在苦恼海康威视的java同胞们,希望对你们有所帮助!
本文内容纯手打!转载请注明出处,谢谢!
另:本文一切需下载的文件,均可在页头链接处一次性下载完成!