【笔记】海康摄像头 SpringBoot 对接视频流播放

概要

接到需求需要对接海康的摄像头,之前没有玩过,这里记录下对接过程,上网查了下资料一大堆感觉都比较麻烦,后面找到一个比较简单快速的方式 采用 webrtc-streamer 进行视频流播放

一、获取RTSP取流URL

1. 摄像头自带

海康这里已经有自带说明了,登录摄像头后右上角的帮助,注意 这块貌似不同型号的摄像头取流地址不一样,公司提供的测试的摄像头的格式和客户的不一样,具体看说明吧

rtsp://admin:hik12345@192.168.1.251:554/h264/ch1/main/av_stream
rtsp://admin:hik12345@192.168.1.64:554/Streaming/Channels/101

在这里插入图片描述
在这里插入图片描述
注意 需要设置 视频编码类型为 H.264 因为测试发现 webrtc-streamer 不支持H.265
在这里插入图片描述

2. OpenAPi获取(综合安防管理平台)

由于客户在海外的摄像头,无法直接通过RTSP 接入,需要使用综合安防管理平台 来进行获取,这里简单封装了一个工具类(需要注意获取到RTSP地址有效期为5分钟)

2.1 引入Maven依赖
            <!-- 海康加密认证SDK -->
            <dependency>
                <groupId>com.hikvision.ga</groupId>
                <artifactId>artemis-http-client</artifactId>
                <version>1.1.3</version>
            </dependency>
2.2 工具类代码
import cn.hutool.core.map.MapUtil;
import cn.hutool.json.JSONArray;
import cn.hutool.json.JSONObject;
import cn.hutool.json.JSONUtil;
import com.hikvision.artemis.sdk.ArtemisHttpUtil;
import com.hikvision.artemis.sdk.config.ArtemisConfig;
import lombok.extern.slf4j.Slf4j;

import java.util.Map;

/**
 * 海康视频流获取
 * <a href="https://open.hikvision.com/docs/docId?productId=5c67f1e2f05948198c909700&version=%2Ff95e951cefc54578b523d1738f65f0a1&tagPath=%E5%AF%B9%E6%8E%A5%E6%8C%87%E5%8D%97">...</a>
 *
 * @author llmoe
 * @date 2024/7/28 10:43
 * @since 1.0.0
 */
@Slf4j
public class HikvisionUtil {

    /**
     * 能力开放平台的网站路径
     */
    private static final String ARTEMIS_PATH = "/artemis";

    /**
     * 分页获取监控点资源
     * <a href="https://open.hikvision.com/docs/docId?productId=5c67f1e2f05948198c909700&version=%2Ff95e951cefc54578b523d1738f65f0a1&tagPath=API%E5%88%97%E8%A1%A8-%E8%A7%86%E9%A2%91%E5%BA%94%E7%94%A8%E6%9C%8D%E5%8A%A1-%E8%A7%86%E9%A2%91%E8%B5%84%E6%BA%90#ef459f4b">...</a>
     */
    private static final String CAMERAS = "/api/resource/v1/cameras";

    /**
     * 获取监控点预览取流URL
     * <a href="https://open.hikvision.com/docs/docId?productId=5c67f1e2f05948198c909700&version=%2Ff95e951cefc54578b523d1738f65f0a1&tagPath=API%E5%88%97%E8%A1%A8-%E8%A7%86%E9%A2%91%E5%BA%94%E7%94%A8%E6%9C%8D%E5%8A%A1-%E8%A7%86%E9%A2%91%E8%83%BD%E5%8A%9B">...</a>
     */
    private static final String PREVIEW_URLS = "/api/video/v2/cameras/previewURLs";

    /**
     * 获取监控点回放取流URL
     * <a href="https://open.hikvision.com/docs/docId?productId=5c67f1e2f05948198c909700&version=%2Ff95e951cefc54578b523d1738f65f0a1&tagPath=API%E5%88%97%E8%A1%A8-%E8%A7%86%E9%A2%91%E5%BA%94%E7%94%A8%E6%9C%8D%E5%8A%A1-%E8%A7%86%E9%A2%91%E8%83%BD%E5%8A%9B">...</a>
     */
    private static final String PLAYBACK_URLS = "/api/video/v2/cameras/playbackURLs";

    /**
     * 请求类型
     */
    private static final String CONTENT_TYPE = "application/json";

    /**
     * 成功返回码
     */
    private static final String SUCCESS = "0";


    /**
     * 分页获取监控点资源
     *
     * @param appKey    访问密钥ID
     * @param appSecret 与访问密钥ID结合使用的密钥
     * @param host      平台门户/nginx的IP和端口(必须https)
     */
    public static JSONArray getCameras(String host, String appKey, String appSecret) {
        // 构建请求path
        Map<String, String> path = MapUtil.builder("https://", ARTEMIS_PATH + CAMERAS).build();

        ArtemisConfig artemisConfig = new ArtemisConfig();
        artemisConfig.setHost(host);
        artemisConfig.setAppKey(appKey);
        artemisConfig.setAppSecret(appSecret);

        JSONObject jsonBody = new JSONObject();
        jsonBody.set("pageSize", 10000);
        jsonBody.set("pageNo", 1);
        // 调用接口
        String result = ArtemisHttpUtil.doPostStringArtemis(path, jsonBody.toString(), null, null, CONTENT_TYPE, null);
        // 获取返回结果
        JSONObject data = getData(result);
        return data.getJSONArray("list");
    }


    /**
     * 校验结果并且获取data
     *
     * @param result 返回参数
     */
    private static JSONObject getData(String result) {
        // 获取返回结果
        JSONObject object = JSONUtil.parseObj(result);
        //返回码,0 – 成功,其他- 失败,参考附录E.1.1 视频应用错误码
        if (!SUCCESS.equals(object.getStr("code"))) {
            throw new RuntimeException("海康平台返回失败:" + object.getStr("msg"));
        }
        return object.getJSONObject("data");
    }


    /**
     * 获取海康视频流URL(取流URL设有有效时间,有效时间为5分钟。)
     *
     * @param appKey          访问密钥ID
     * @param appSecret       与访问密钥ID结合使用的密钥
     * @param host            平台门户/nginx的IP和端口(必须https)
     * @param cameraIndexCode 监控点唯一标识,分页获取监控点资源接口获取返回参数cameraIndexCode
     */
    public String getVideoPreviewUrl(String cameraIndexCode, String host, String appKey, String appSecret) {
        // 构建请求path
        Map<String, String> path = MapUtil.builder("https://", ARTEMIS_PATH + PREVIEW_URLS).build();

        JSONObject parameter = new JSONObject();
        // 监控点唯一标识
        parameter.set("cameraIndexCode", cameraIndexCode);
        // 码流类型,0:主码流 1:子码流 2:第三码流 参数不填,默认为主码流
        parameter.set("streamType", 0);
        // 取流协议(应用层协议
        parameter.set("protocol", "rtsp");
        // 传输协议(传输层协议),0:UDP 1:TCP
        parameter.set("transmode", 1);
        // 输出码流转封装格式,“ps”:PS封装格式、“rtp”:RTP封装协议。当protocol=rtsp时生效,且不传值时默认为RTP封装协议。
        parameter.set("streamform", "rtp");

        ArtemisConfig artemisConfig = new ArtemisConfig();
        artemisConfig.setHost(host);
        artemisConfig.setAppKey(appKey);
        artemisConfig.setAppSecret(appSecret);

        String result = ArtemisHttpUtil.doPostStringArtemis(path, parameter.toString(), null, null, CONTENT_TYPE, null);

        JSONObject info = getData(result);

        return info.getStr("url");
    }

    /**
     * 获取监控点回放取流URL
     *
     * @param appKey          访问密钥ID
     * @param appSecret       与访问密钥ID结合使用的密钥
     * @param host            平台门户/nginx的IP和端口(必须https)
     * @param cameraIndexCode 监控点唯一标识,分页获取监控点资源接口获取返回参数cameraIndexCode
     **/
    public JSONObject getVideoHistoryUrl(String cameraIndexCode, String host, String appKey, String appSecret,
                                         String beginTime,//"2022-07-22T09:58:58.000+08:00"
                                         String endTime//"2022-07-22T10:00:00.000+08:00"
    ) {
        // 构建请求path
        Map<String, String> path = MapUtil.builder("https://", ARTEMIS_PATH + PLAYBACK_URLS).build();

        JSONObject parameter = new JSONObject();
        // 监控点唯一标识
        parameter.set("cameraIndexCode", cameraIndexCode);
        // 取流协议(应用层协议)
        parameter.set("protocol", "rtsp");
        //传输协议(传输层协议)0:UDP 1:TCP 默认为TCP,在protocol设置为rtsp或者rtmp时有效
        parameter.set("transmode", 1);
        // 查询录像的锁定类型,0-查询全部录像;1-查询未锁定录像;2-查询已锁定录像,不传默认值为0。
        parameter.set("lockType", 0);
        // 开始查询时间(IOS8601格式:yyyy-MM-dd’T’HH:mm:ss.SSSXXX)
        parameter.set("beginTime", beginTime);
        // 结束查询时间,开始时间和结束时间相差不超过三天;(IOS8601格式:yyyy-MM-dd’T’HH:mm:ss.SSSXXX)
        parameter.set("endTime", endTime);

        ArtemisConfig artemisConfig = new ArtemisConfig();
        artemisConfig.setHost(host);
        artemisConfig.setAppKey(appKey);
        artemisConfig.setAppSecret(appSecret);

        String result = ArtemisHttpUtil.doPostStringArtemis(path, parameter.toString(), null, null, CONTENT_TYPE, null);

        return getData(result);
    }
}

二、安装webrtc-streamer

官方地址:https://github.com/mpromonet/webrtc-streamer

1. 什么是webrtc-streamer?

webrtc-streamer是一个使用简单机制通过 WebRTC 流式传输视频捕获设备和 RTSP 源的项目,它内置了一个小型的 HTTP server 来对 WebRTC需要的相关接口提供支持。

2. 安装步骤

2.1 下载webrtc-streamer

地址:https://github.com/mpromonet/webrtc-streamer/releases

2.2 解压下载的安装

在这里插入图片描述

2.3 启动服务
  1. 双击 webrtc-streamer.exe 即可启动
  2. 为了方便写了个bat
@echo off
@echo.
@echo ==========【信息】 运行视频服务 ==========
@echo.

:start
 
 # -H9800 为端口9800  默认8000, -o 会比较少吃CPU(没去研究)
START "视频流_9800" webrtc-streamer.exe -H9800 -o

exit

启动成功,在浏览器访问127.0.0.1:9800 画面
在这里插入图片描述

三、视频访问测试

浏览器访问即可

1. 摄像头自带

http://127.0.0.1:9800/webrtcstreamer.html?video=rtsp://账号:密码@192.168.1.251:554/h264/ch1/main/av_stream

2. OpenApi获取流地址

http://127.0.0.1:9800/webrtcstreamer.html?video=rtsp://192.168.110.253:554/openUrl/vsigDZ5PwWS205037dc9f1d4122ad80a

访问后即可看到监控画面
在这里插入图片描述

四、整合项目预览

页面中需要用到的js文件:【webrtcstreamer.js】、【adapter.min.js】,分别在windows版的【html】和【html\libs】目录

<!DOCTYPE html>
<html>
    <head>
        <meta charset="utf-8">
        <title></title>
    </head>
    <body>
        <video id='video' style='object-fit:fill' controls autoplay autobuffer muted preload='auto'></video>
        
        <script type="text/javascript" src="./js/webrtcstreamer.js"></script>
        <script type="text/javascript" src="./js/adapter.min.js"></script>
        <script type="text/javascript" src="./js/jquery-3.2.1.min.js"></script>
        <script>        
            var webRtcServer = null;
            
            //页面加载时加载视频画面
            window.onload = function() { 
                //video:需要绑定的video控件ID
                //192.168.1.226:启动webrtc-streamer的设备IP
                webRtcServer = new WebRtcStreamer("video",location.protocol+"//192.168.1.226:9800");
                //需要查看的rtsp地址
                webRtcServer.connect("rtsp://admin:12345@192.168.1.65:554/h264/ch1/main/av_stream");
            }
            
            //页面退出时销毁
            window.onbeforeunload = function() { 
                webRtcServer.disconnect();
            }
        </script>
    </body>
</html>
 

参考资料:

https://blog.csdn.net/qq_43659075/article/details/135439520
https://blog.csdn.net/qq_20937557/article/details/129879697
https://blog.csdn.net/weixin_44692055/article/details/128657669

小结

注意:视频编码只支持类型为 H.264 webrtc-streamer 不支持H.265

### 回答1: TCP是一种面向连接的传输层协议,而IIS(Internet Information Services)是一种用于在Windows服务器上托管网站和应用程序的Web服务器软件。对接摄像头则是指将摄像头与服务器进行连接和通信。 首先,TCP作为传输层协议,可以提供可靠的数据传输。通过TCP协议,可以建立和维护一个可靠的连接,确保数据的完整性和有序性。对接摄像头时,可以利用TCP协议建立一个稳定的连接,以保证视频数据的准确传输和实时性。 其次,IIS作为一个Web服务器软件,可以提供HTTP和HTTPS服务。通过IIS,我们可以创建一个基于HTTP或HTTPS协议的服务端点,来接收从摄像头传输过来的数据。这样,摄像头可以将实时采集到的视频数据发送到IIS服务器,同时,服务器也可以向摄像头发送控制指令。 在具体实现上,可以通过开发相应的程序或使用现有的软件实现TCP和IIS对接摄像头。首先,需要在IIS服务器上设置和配置相应的Web应用程序,例如ASP.NET等。然后,通过相应的编程语言(如C#、Python等)编写摄像头和服务器之间的通信代码,以建立TCP连接并实现数据传输。需要注意的是,摄像头需要具备相应的网络通信能力,以便与服务器进行连接和通信。 最后,通过TCP和IIS对接摄像头,可以实现将摄像头的实时视频数据传输到服务器,并在服务器上进行实时监控、录制、存储等操作。这种方式可以用于安防监控、视频会议、远程教育等应用场景。 ### 回答2: TCP通常与IIS(Internet Information Services)对接摄像头,以实现从摄像头采集视频流并通过网络传输或共享给其他设备或用户的功能。 IIS是一种用于Microsoft Windows操作系统的Web服务器软件。它支持各种Internet协议,包括TCP/IP。当需要将摄像头视频流通过网络传输到其他设备或用户时,可以通过与IIS的TCP对接来实现。 首先,需要在IIS上创建一个虚拟目录或虚拟应用程序来接收来自摄像头视频流。这可以通过IIS管理工具进行配置。虚拟目录或虚拟应用程序将定义一个特定的URL,用于接收视频流。 然后,在摄像头上配置将视频流发送到IIS服务器的地址和端口。摄像头可以使用TCP协议与IIS进行通信,并向定义的URL发送视频流。这样,视频流将被发送到IIS服务器并存储在IIS的虚拟目录或虚拟应用程序中。 最后,其他设备或用户可以通过访问IIS服务器上的URL来获取并查看摄像头发送的视频流。他们可以使用与IIS兼容的HTTP客户端来访问IIS服务器,并获取视频流数据。 通过以上步骤,TCP与IIS的对接使得摄像头视频流可以通过网络传输给其他设备或用户,实现实时的视频监控或共享功能。这种对接方法可以用于各种场景,例如家庭监控系统、企业安防系统等。 ### 回答3: TCP IIS对接摄像头是指通过TCP/IP协议将摄像头与IIS(Internet Information Services)服务器进行连接和通信的过程。 首先,TCP/IP是一种网络传输协议,它提供了可靠的、有序的、基于连接的通信,因此通过TCP/IP协议可以保证安全、稳定和高效的数据传输。摄像头通常也具备支持TCP/IP通信的功能。 IIS是微软的一个Web服务器软件,它提供了一种完成各种Web服务的平台。在IIS中,可以通过配置一些功能,将摄像头与服务器进行对接,实现对摄像头的远程访问和控制。 对接摄像头的过程一般包括以下几个步骤: 1. 确认摄像头支持TCP/IP协议,并连接到网络。摄像头需要具备支持TCP/IP通信的能力,可以通过有线或无线方式连接到网络。 2. 配置IIS服务器。在IIS服务器上,需要启用相关功能,并配置相应的网络设置,以便与摄像头进行通信。例如,配置网络端口、IP地址等。 3. 在IIS服务器上添加摄像头设备。通过管理工具,可以在IIS服务器上添加摄像头设备并配置相关参数,如摄像头的IP地址、用户名、密码等。 4. 建立TCP连接。通过指定摄像头的IP地址和端口号,以及相关的认证信息,在IIS服务器上建立与摄像头的TCP连接。 5. 远程访问和控制。一旦TCP连接建立成功,就可以通过IIS服务器远程访问和控制摄像头。可以通过浏览器访问服务器上的Web页面,实时查看和控制摄像头的图像、视频等。 通过上述步骤,TCP IIS对接摄像头可以实现远程监控、视频录制、图像捕捉等功能。这种方式广泛应用于安防监控、视频会议、远程教育等领域。
评论 3
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值