海康威视 java B/S 开发 流程

早过忘川 提交于 2019-11-25 18:58:21

最近项目用到了一个调用海康威视摄像头实现外网网页预览的需求,由于第一次接触这类需求,不免有些焦头烂额,现终于将需求实现,故,作一笔记用于记忆,并希望帮到要用的人。废话不多说,直接开始:

注:本文中所有的使用的代码和工具以及安装包的下载地址如下:

      传送门:https://download.csdn.net/download/qq_36720088/10696597

一、分析流程

整理了一下整个流程,共分以下四个步骤:

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:admin123456@10.192.44.101: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同胞们,希望对你们有所帮助!

本文内容纯手打!转载请注明出处,谢谢!

另:本文一切需下载的文件,均可在页头链接处一次性下载完成!

 

 

 

 

 

 

 

 

 

 

易学教程内所有资源均来自网络或用户发布的内容,如有违反法律规定的内容欢迎反馈
该文章没有解决你所遇到的问题?点击提问,说说你的问题,让更多的人一起探讨吧!