SpringBoot+海康威视摄像头实现在前端的预览

这篇具有很好参考价值的文章主要介绍了SpringBoot+海康威视摄像头实现在前端的预览。希望对大家有所帮助。如果存在错误或未考虑完全的地方,请大家不吝赐教,您也可以点击"举报违法"按钮提交疑问。

前言

本文是之前文章的一篇完善文,如果你是才接触海康威视摄像头的二次开发请先阅读入门篇

摄像头预览

1.什么是rtsp

在实现摄像头的预览的时候需要搞懂什么是rtsp。

rtsp是一种实时流传输协议(Real Time Streaming Protocol,RTSP),主要使用TCP和UDP完成数据的传输。

1.1 了解海康威视rtsp的url规范

【老版本】URL规定:

rtsp://username:password@[ipaddress]/[videotype]/ch[number]/[streamtype]

注:VLC可以支持解析URL里的用户名密码,实际发给设备的RTSP请求不支持带用户名密码。

详细描述:

SpringBoot+海康威视摄像头实现在前端的预览

举例说明:

通道01主码流:
rtsp://admin:test1234@172.6.22.106:554/h264/ch01/main/av_stream

通道01子码流:
rtsp://admin:test1234@172.6.22.106:554/h264/ch01/sub/av_stream

通道01第3码流:
rtsp://admin:test1234@172.6.22.106:554/h264/ch01/stream3/av_stream

IP通道01的主码流:
rtsp://admin:test1234@172.6.22.106:554/h264/ch33/main/av_stream

IP通道01的子码流:
rtsp://admin:test1234@172.6.22.106:554/h264/ch33/sub/av_stream

零通道主码流(零通道无子码流):
rtsp://admin:test1234@172.6.22.106:554/h264/ch0/main/av_stream

注:老版本URL,64路以下的NVR的IP通道的通道号从33开始,64路以及以上路数的NVR的IP通道的通道号从1开始。

【新版本】URL规定:

rtsp://username:password@[address]:[port]/Streaming/Channels/[id](?parm1=value1&parm2-=value2…)

注:VLC可以支持解析URL里的用户名密码,实际发给设备的RTSP请求不支持带用户名密码。

详细描述:

SpringBoot+海康威视摄像头实现在前端的预览

举例说明:

通道01主码流:
rtsp://admin:abc12345@172.6.22.234:554/Streaming/Channels/101?transportmode=unicast

通道01子码流:
rtsp://admin:abc12345@172.6.22.234:554/Streaming/Channels/102?transportmode=unicast(单播)
rtsp://admin:abc12345@172.6.22.106:554/Streaming/Channels/102?transportmode=multicast (多播)
rtsp://admin:abc12345@172.6.22.106:554/Streaming/Channels/102 (?后面可省略,默认单播)

通道01第3码流:
rtsp://admin:abc12345@172.6.22.234:554/Streaming/Channels/103?transportmode=unicast

零通道主码流(零通道无子码流):
rtsp://admin:12345@172.6.22.106:554/Streaming/Channels/001

注:新版本URL,通道号全部按顺序从1开始。

针对上面的单播多播做一个解释

单播:用网络技术的术语来描述就是“单播”,此时信息的接收和传递只在两个节点之间进行,

网络节点之间的通信就好像是人们之间的对话一样。如果一个人对另外一个人说话。
多播:多播也称为“组播”:将网络中同一业务类型主机进行了逻辑上的分组,

进行数据收发的时候其数据仅仅在同一分组中进行,其他的主机没有加入此分组不能收发对应的数据。

大概了解了rtsp和海康威视的url规范之后我们来拼接一个可以播放的地址。

1.2 下载(VLC media player)VLC多媒体播放器

SpringBoot+海康威视摄像头实现在前端的预览
SpringBoot+海康威视摄像头实现在前端的预览
SpringBoot+海康威视摄像头实现在前端的预览

SpringBoot+海康威视摄像头实现在前端的预览

能成功播放就说明成功了

注:没有成功的可以检查一下摄像头的状态和rtsp地址

2.用FFmpeg+Nginx-rtmp推流

2.1 使用FFmpeg工具+Nginx-rtmp模块

上面我们说到了rtsp,但是这种格式前端是不能直接播放的。

所以我们需要使用FFmpeg把流进行转换,再用Nginx-rtmp模块把流推到我们要播放的地址。

逻辑比较简单,但是这里需要用到2个插件。

注:用这种方式推出来的流是rtmp格式的流,需要Flash插件,后面写一个不需要Flash插件的

这种方式的好处是延迟低可能只有0.2延迟左右,缺点是需要Flash的插件支持。

2.2 下载FFmpeg

SpringBoot+海康威视摄像头实现在前端的预览

下载稳定版的

SpringBoot+海康威视摄像头实现在前端的预览

下载解压到指定目录

SpringBoot+海康威视摄像头实现在前端的预览

配置ffmpeg的环境变量

计算机右键属性——>高级系统设置——>环境变量——>系统变量——>Path——>放入ffmpeg解压之后的目录的bin文件夹地址

SpringBoot+海康威视摄像头实现在前端的预览

输入下面的命令

ffmpeg -version

SpringBoot+海康威视摄像头实现在前端的预览

2.3 在Java里面操作FFmpeg

这里需要下载一个三方集成的jar包,来操作和执行FFmpeg命令。

阿里云盘地址:https://www.aliyundrive.com/s/zjEKF198tNE

提取码:2vn4

这里是下载解压之后的存放jar包的位置,jar包中配置文件的路径是作者的FFmpeg的安装路径。

注:可以更改源码自行编译jar包。

或者在自己的Springboot项目中建一个loadFFmpeg.properties配置文件来覆盖

SpringBoot+海康威视摄像头实现在前端的预览

这里也是建议把这个jar包打进自己的maven仓库,然后引入这个jar包。

SpringBoot+海康威视摄像头实现在前端的预览

注:这三个方法需要注意,后面会用

因为这个第三方包默认是以udp推流的,所以需要修改源码中的CommandAssemblyImpl类

SpringBoot+海康威视摄像头实现在前端的预览

2.4 在Nginx中配置rtmp模块

这里有一个源码地址,需要自己编译(有能力的可以在windows自行编译)

https://github.com/arut/nginx-rtmp-module

这个是已经编译好的(但是版本不是最新的)

https://github.com/illuspas/nginx-rtmp-win32

打开文件夹找到配置文件

SpringBoot+海康威视摄像头实现在前端的预览

重点注意这里的配置

SpringBoot+海康威视摄像头实现在前端的预览

2.5 得到rtmp流

复习一下前面的流程

rtsp流——>ffmpeg+Nginx-rtmp——>rtmp流——>前端播放

下面的方法会涉及到SDK的一些接口,没看过的可以看之前的入门篇

之前的入门篇讲过,在需要执行操作的时候都需要登录摄像头。

所以这里的这个获取通道号的时候前面是需要登录的,方法中的lUserID就是登录接口的返回值

注:通道号可以理解为相机的标识,用来区分调用的是哪一个摄像头

/**
 * 获取相机通道号
 */
public int getChannelNumber() {
    //获取IP接入配置参数
    IntByReference ibrBytesReturned = new IntByReference(0);
    boolean bRet;
    int iChannelNum = -1;
    ipparacfg = new HCNetSDK.NET_DVR_IPPARACFG();
    ipparacfg.write();
    Pointer lpIpParaConfig = ipparacfg.getPointer();
    bRet = hcNetSDK.NET_DVR_GetDVRConfig(lUserID, HCNetSDK.NET_DVR_GET_IPPARACFG, 
                                         0, lpIpParaConfig, ipparacfg.size(), ibrBytesReturned);
    ipparacfg.read();
    String devices = "";
    if (!bRet) {
        //设备不支持,则表示没有IP通道
        for (int iChannum = 0; iChannum < deviceiInfo.byChanNum; iChannum++) {
            devices = "Camera" + (iChannum + deviceiInfo.byStartChan);
        }
    } else {
        for (int iChannum = 0; iChannum < HCNetSDK.MAX_IP_CHANNEL; iChannum++) {
            if (ipparacfg.struIPChanInfo[iChannum].byEnable == 1) {
                devices = "IPCamera" + (iChannum + deviceiInfo.byStartChan);
            }
        }
    }
    if (StringUtils.isNotEmpty(devices)) {
        //Camara开头表示模拟通道
        if (devices.charAt(0) == 'C') {
            //子字符串中获取通道号
            iChannelNum = Integer.parseInt(devices.substring(6));
        } else {
            //IPCamara开头表示IP通道
            if (devices.charAt(0) == 'I') {
                //子字符创中获取通道号,IP通道号要加32
                iChannelNum = Integer.parseInt(devices.substring(8)) + 32;
            } else {
                log.info("获取通道号失败");
            }
        }
    }
    return iChannelNum;
}

推流的方法

private static final FFmpegManager manager =new FFmpegManagerImpl();

/**
 * 开始推流
 * @param appName       进程名称,为相机ip去"."
 * @param account       登录相机账号
 * @param password      密码
 * @param ip            相机ip
 * @param channelNumber 相机的通道号
 * @return String appName 
 */
public static String startPlugFlow(String appName, String account, String password, String ip, int channelNumber) {
    //如果进程存在,则直接返回进程名
    if (MinitorUtil.taskerIsRun(appName)) {
        return appName;
    }
    Map<String, String> map = new HashMap<>(10);
    //尝试用TCP方式 进程名
    map.put("appName", appName);
    // 自定义的参数,需要修改ffmpeg源代码
    map.put("rtspTransport", "tcp");
    //组装rtsp流
    map.put("input", "rtsp://" + account + ":" + password + "@" + ip + "/Streaming/Channels" + channelNumber);
    //rtmp流.live为nginx-rtmp的配置
    map.put("output", "rtmp://" + "本机ip" + ":1935/live/");
    map.put("codec", "copy");
    //只推元码流
    map.put("twoPart", "1");
    map.put("fmt", "flv");
    // 执行任务,就是appName,如果执行失败返回为null
    return manager.start(map);
}

注:上面这个方法执行之前需要启动Nginx,控制台会打印开始推流的命令,

命令执行无误并一直输出红色的推流信息,说明是成功的。

执行完命令之后组装rtmp的url地址

String rtmpurl="rtmp://" + "本机ip" + ":1935/live/" + appName);

这个地址就是最后的rtmp地址了,同样的使用VLC播放器进行测试。

SpringBoot+海康威视摄像头实现在前端的预览

能够正确播放成功说明是没有问题的。

2.6 关闭推流

有推流肯定有关闭推流

SpringBoot+海康威视摄像头实现在前端的预览

3.用FFmpeg+Nginx-FLV推流

3.1 Nginx中配置flv模块

阿里云盘地址:https://www.aliyundrive.com/s/oK9SgRquVvp

提取码:gy20

这里也是一个编译好的模块了。

大概方式和上一种是差不多的

private static final FFmpegManager manager =new FFmpegManagerImpl();

/**
 * 开始推流
 * @param appName       进程名称,为相机ip去"."
 * @param account       登录相机账号
 * @param password      密码
 * @param ip            ip 相机ip
 * @param nginxIp       nginxIp nginx的ip
 * @param nginxPort     nginxIp nginx的端口
 * @param channelNumber 相机的通道号
 * @return String appName 
 */
public static String startPlugFlow(String appName, String account, String password, String ip, 
                                   String nginxIp, String nginxPort, int channelNumber) {
    //如果进程存在,则直接返回进程名
    if (MinitorUtil.taskerIsRun(appName)) {
        return appName;
    }
    Map<String, String> map = new HashMap<>(10);
    //尝试用TCP方式 进程名
    map.put("appName", appName);
    // 自定义的参数,需要修改ffmpeg源代码
    map.put("rtspTransport", "tcp");
    //组装rtsp流
    map.put("input", "rtsp://" + account + ":" + password + "@" + ip + "/Streaming/Channels" + channelNumber);
    //rtmp流.live为nginx-rtmp的配置
    map.put("output", "rtmp://" + nginxIp + ":" + nginxPort + "/live/");
    map.put("codec", "copy");
    //只推元码流
    map.put("twoPart", "1");
    map.put("fmt", "flv");
    // 执行任务,就是appName,如果执行失败返回为null
    return manager.start(map);
}

注:上面这个方法执行之前需要启动Nginx,控制台会打印开始推流的命令,

命令执行无误并一直输出红色的推流信息,说明是成功的。

3.2 返回的http地址

执行完命令之后组装rtmp的url地址

String httpUrl="https://" + "nginxIp" + ":" + "nginxPort" + "/live?port=1935&app=live&stream=" + appName);

成功推流

SpringBoot+海康威视摄像头实现在前端的预览

成功播放

SpringBoot+海康威视摄像头实现在前端的预览

关闭推流:这里的流程和上面是一样的

注:这种方式的优点是不需要Flash插件就能播放

但是存在的问题是延迟较大接近8s左右的延迟和丢包的风险。

4.后续优化

4.1 前端解决方案

前端下载海康威视的前端开发包

SpringBoot+海康威视摄像头实现在前端的预览文章来源地址https://www.toymoban.com/news/detail-401934.html

4.2 后端解决方案

  1. 优化FFmpeg的命令和方法。更新并编译更高Nginx的版本。
  2. 使用WVP+流媒体服务器实现推流。

到了这里,关于SpringBoot+海康威视摄像头实现在前端的预览的文章就介绍完了。如果您还想了解更多内容,请在右上角搜索TOY模板网以前的文章或继续浏览下面的相关文章,希望大家以后多多支持TOY模板网!

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处: 如若内容造成侵权/违法违规/事实不符,请点击违法举报进行投诉反馈,一经查实,立即删除!

领支付宝红包 赞助服务器费用

相关文章

  • QML实现海康威视、TP_LINK等摄像头视频接入

           随着物联网的发展,越来越多的企业期望在系统平台中接入摄像头视频,达到对现场的实时视频监控的目的。本文通过QML接入海康、TP_LINK等摄像头的视频流从而在平台上展示视频。        1、要做到摄像头视频的接入首先要保证摄像头的通信是正常的,即系统终端和

    2024年02月03日
    浏览(120)
  • 海康威视摄像头选型号指南

    看了一个星期的摄像头,经过无数的踩坑和扯皮,看了无数的说明书和博文,终于从茫茫的摄像头型号中浮上岸了,对这个摄像头是什么玩意儿有了大致清晰的认识。我只是用来开发的,怎么简单怎么来,所以和民用的方向不一样,但也可做个参考。 像素:200-400万(根据需求

    2024年02月09日
    浏览(148)
  • 海康威视摄像头二次开发_云台控制_视频画面实时预览(基于Qt实现)

    需求:需要在公司的产品里集成海康威视摄像头的SDK,用于控制海康威视的摄像头。 拍照抓图、视频录制、云台控制、视频实时预览等等功能。 开发环境: windows-X64(系统) + Qt5.12.6(Qt版本) + MSVC2017_X64(使用的编译器) 海康威视提供了 设备网络SDK ,设备网络SDK是基于设备私有网

    2024年02月13日
    浏览(34)
  • C# 搜索海康威视网络摄像头

    源代码 https://download.csdn.net/download/syukugai/88299251

    2024年02月10日
    浏览(37)
  • opencv调用海康威视工业摄像头

    opencv调用海康威视工业摄像头需要用到官方接口VideoCapture() 接口:cv2.VideoCapture() 作用:获取本地目录下的视频文件或者使用本电脑的摄像头获取实时数据;  “0” ,调用的是本地电脑摄像头 “1” ,调用的是外接摄像头 打开MVS  正常设置使画面正常  然后找到宽度和长度

    2024年02月13日
    浏览(31)
  • 海康威视监控摄像头连接电脑教程

    官网下载SADP软件:https://www.wolai.com/wM6rWeBrRtrfmMH2BTVUXZ 双击下载的软件进行安装 打开软件,将设备连接到摄像头,便可在软件中搜索到摄像头 选择摄像头,输入管理员密码,即可完成对摄像头的控制 设置摄像机IP地址与网口地址处于同一网段 设置网络摄像机IP地址时,保持设

    2024年02月04日
    浏览(143)
  • 海康威视摄像头播放录像视频(RTSP协议)

    旧URL:rtsp://[username]:[password]@[ipaddress]/[videotype]/ch[number]/[streamtype] 如:rtsp://admin:12345@192.168.25.64:554/h264/ch1/main/av_stream 新URL:rtsp://[username]:[password]@[IP]:554/Streaming/Channels/[channelID][streamID] 如:rtsp://admin:12345@192.168.25.64:554/Streaming/Channels/101 录像机其实和摄像机基本一样,旧URL中摄像

    2024年02月12日
    浏览(57)
  • 海康威视网络摄像头网线直连电脑

    1、网络相机型号:DS-2CD3T86FWDV2 2.摄像头上电,摄像头、电脑连接同一个网线 客户端软件 - 桌面应用软件 - 海康威视 Hikvision 下载客户端软件  安装完成,创建用户,密码 设备管理--设备  刷新 ,就会看到设备,默认的ip地址的192.168.1.64 到控制面板,”以太网“ 就是我们跟摄

    2024年02月11日
    浏览(51)
  • vue+js+海康web开发包接入海康威视摄像头

    一、登录海康开放平台下载web开发包,下载需要先登录海康账号,没有的需先注册一个。 海康开放平台web开发包下载地址:https://open.hikvision.com/download/5cda567cf47ae80dd41a54b3?type=10id=4c945d18fa5f49638ce517ec32e24e24 二、将web开发包引入vue项目 下载后解压的包目录如下: 将把webs下的整个

    2024年02月02日
    浏览(37)
  • 海康威视摄像头的多通道rtsp地址格式

    海康摄像头的rtsp地址通常格式为: “rtsp://username:password@192.168.1.64:554//Streaming/Channels/1” ### 1 代表主流,2代表子流 但在多通道的摄像机,例如红外摄像机,既有rgb图也有红外图,分别在两个通道里,需要独立打开时,就需要指定通道号。 那么可以这样来给rtsp最后的数字串:

    2024年02月13日
    浏览(81)

觉得文章有用就打赏一下文章作者

支付宝扫一扫打赏

博客赞助

微信扫一扫打赏

请作者喝杯咖啡吧~博客赞助

支付宝扫一扫领取红包,优惠每天领

二维码1

领取红包

二维码2

领红包