海康摄像机/录像机对接方式记录

海康摄像机/录像机对接方式记录

Author: OwnDing

Date: 2025-01-02

最近有在做海康摄像机/录像机对接方面的工作,之前也做过类似的工作,但都比较定制化,这次趁着自己有些空做些对接实践。

本次对接海康摄像头/录像机是使用IP直接读取摄像头的数据,并没有用到海康的平台。

本次测试的对接方式有2种:

1)使用海康的SDK进行对接,需要登入到海康官网下载对应的SDK。

2)使用ZLMediaKit 直接拉取摄像头的 rtsp流,然后进行转换后,使用其它软件可以直接播视频监控。

总体来说,第二种方案简单快速无需自己编程。

1、SDK对接

SDK对接,需要自己进行程序编写。此处给出一个Spring Boot程序集成海康SDK的例子。

代码Demo链接:

https://github.com/OwnDing/hkdemo.git

2、ZLMediaKit中转读取

此种方法比较简单,无需自己编写代码即可提供可供VLC软件或前端播放的监控视频。

建议使用Docker进行部署ZLMediaKit。

1)确定摄像头rtsp地址

使用浏览器访问摄像头的控制台,比如摄像头的IP是192.168.88.88,那么在浏览器中输入:http://192.168.88.88 即可访问摄像头的控制台,输入账号密码即可登入。

确定好rtsp的端口:

image
端口查看rtsp流地址示例:

规则:rtsp://[username]:[password]@[ip]:[port]/[codec]/[channel]/[subtype]/av_stream

实例:rtsp://admin:hik12345@192.168.88.88:554/h266/ch1/main/av_stream

说明:

username: 用户名。例如admin。

password: 密码。例如12345。

ip: 为设备IP。

port: 端口号默认为554。

codec:有h264、MPEG-4、mpeg、h266这几种。

channel: 通道号,起始为1。

subtype: 码流类型,主码流为main,辅码流为sub。

例如,请求海康摄像机通道1的主码流,Url如下

主码流:rtsp://admin:12345@192.0.0.64:554/h264/ch1/main/av_stream

你可以下载一个VLC播放器,然后把rtsp地址复制到VLC播放器里进行播放测试(菜单:媒体–>流–>网络),能正常播放说明地址正确。

image

2)部署ZLMediaKit

使用Docker进行部署:

1
docker run -id -p 1935:1935 -p 8080:80 -p 8443:443 -p 8554:554 -p 10000:10000 -p 10000:10000/udp -p 8000:8000/udp -p 9000:9000/udp zlmediakit/zlmediakit:master

ZLMediaKit 启动后,配置文件在容器中 /opt/media/conf/config.ini (这是容器中的文件), 里面有 secret 密钥。我们访问ZLMediaKit控制台需要这个密钥。

3)访问ZLMediaKit控制台。

访问ZlMediaKit控制台,访问形式需要带上密钥:

http://192.168.88.10:8080/webassist/?secret=p7ApNF5w0AmnPHConD7NKV4TBrNnKyow

其中secret在容器中config.ini文件中。

image
ZLMediaKit控制台4)添加rtsp流

添加rtsp流有两种方法:

第一种:此处可以在ZLMediaKit的控制台操作完成,点击”拉流代理”

image
拉流代理第二种:使用API工具

image
API添加代理使用GET方法,访问ZLMediaKit所在服务器/电脑的 IP:PORT/index/api/addStreamProxy

填入:secreturlstreamappvhost 5个参数。

secret:zlmediakit的secret

url:是摄像头rtsp流地址

stream:可自行填写

app:可填 live

vhost:填 ZLMediaKit所在服务器/电脑的 IP

当返回如上图数据时即表示成功,在ZLMediaKit控制台”拉流代理”菜单中可以看到我们刚添加的代理。

使用API生成的URL,注意需要加上端口,因为容器部署后端口有映射。

使用VLC打开 流:http://192.168.83.10:8080/live/zt/hls.m3u8 即可看到监控视频

其中 http://192.168.83.10:8080/live/zt 是返回的数据加上端口,然后 hls.m3u8 是固定的路径。

如果你不想使用VLC打开 http://192.168.83.10:8080/live/zt/hls.m3u8 可以自己创建一个 html 页面,然后使用浏览器打开这个 html 即可看到监控视频。

html示例代码:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
<!DOCTYPE html>
<html>
<head>
<title>[HLS](https://zhida.zhihu.com/search?content_id=252193051&content_type=Article&match_order=1&q=HLS&zhida_source=entity) Stream Player</title>
</head>
<body>
<h1>Live Stream</h1>
<video id="video" controls autoplay></video>
<script src="https://cdn.jsdelivr.net/hls.js/latest/hls.min.js"></script>
<!-- <script src="./dist/hls.js.d.ts"></script> -->
<script>
if(Hls.isSupported()) {
var video = document.getElementById('video');
var hls = new Hls();
hls.loadSource('http://192.168.83.10:8080/live/zt/hls.m3u8');
hls.attachMedia(video);
hls.on(Hls.Events.MANIFEST_PARSED,function() {
video.play();
});
} else if (video.canPlayType('application/vnd.apple.mpegurl')) {
// 如果浏览器原生支持 HLS,则直接设置 video.src
video.src = 'http://192.168.83.10:8080/live/zt/hls.fmp4.m3u8';
video.addEventListener('loadedmetadata',function() {
video.play();
});
}
</script>
</body>
</html>

3、异常问题记录

1)使用VLC能够打开 http://192.168.83.10:8080/live/zt/hls.m3u8 链接,但是使用浏览器一直无法播放HLS

问题原因:摄像头的编码格式是 H.265

解决方法:在摄像头控制台将编码格式改成 H.264

image
视频编码

4、家用视频方案

现在市面上有很多家用摄像头,用户可以在家里安装摄像头,然后通过厂商的APP实时查看摄像头内容。但是市面上的方案都有一个问题,就是摄像头的资料会存储到厂商的服务器里,并且需要每年付费使用。摄像头内容比较隐私,我不想将内容直接存储在厂家那,最重要的是每年还需要付费使用云资源。

我自己长期有一台云服务器,我就在想是不是可以将视频内容直接存到我云服务器上,这样我也可以实时查看摄像头的内容。

实际上使用ZLMediaKit可以自己搭建视频监控平台,将数据存储到自己的云服务器或者百度网盘之类的工具上。