概述
本文主要介绍视频监控设备,视频监控设备接入,常用的开源流媒体及接入过程中的一些问题。
第一章 视频监控设备
目前常见的视频监控设备主要有NVR和IPC,以海康为例。
1.1 视频监控设备介绍
IPC即IP Camera,可以接入网络的摄像头,如下图。
NVR即Network Video Recorder,网络视频录像机,可以进行视频流存储和转发,管理多个IPC,如下图,以海康为例,通道管理可以查看各路IPC视频设备。
1.2 接入方式
视频监控设备接入普遍使用GB28181或RTSP协议介绍,在接入的过程中本人发现,由于云平台发展,GB接入有很多限制,例如海康通常会上一套IVMS和萤石云,萤石云接入可以让用户在手机端查看视频,但是会导致不能使用GB接入,所以我后来都优先使用RTSP协议接入,RTSP整体还是很适合监控视频接入。如下图,是客户现场的一个NVR配置,平台接入使用的萤石云:
RTSP基本主流的监控设备都支持,默认554端口,RTSP支持推拉流双向模式,低延时,很适合监控视频,可以使用VLC播放器播放,不过在浏览器端不能直接播放,需要使用ffmpeg转一下,最终使用RTMP或HLS等形式在浏览器端直播,下面会逐个介绍。
第二章 视频设备接入
视频设备接入有以下几种方式:
- 使用视频设备SDK解码接入,官方有较详细的资料,比较麻烦;
- 搭建流媒体服务,使用GB、RTSP等协议接入,流媒体服务开源的比较多,接入较简单,不过也有很多坑要踩一踩。
下面介绍几种开源流媒体及接入方式。
2.1 SRS
SRS开源地址:SRS开源地址
GB28181分支:已经合并到srs5.0
srs的目标是打造一个好的流媒体服务,而不是接入,srs5.0后来没用过,笔者使用过srs-gb28181(合并之前),gb支持维护并不是很好,接入后有很多问题,例如NVR接入,一段时间后流会掉,需要重启或者手动注销会话后才能再次推流,推流或断开不能回调等。
关于国标的一些问题以及接入方式可参考:SRS国标接入说明
2.2 wvp-GB28181-pro
wvp开源地址:wvp开源地址
wvp需要结合ZLMediaKit流媒体服务,是一个开箱即用的28181协议视频平台,使用Java和Vue开发,包含设备管理、录像、视频广场等功能,代码前后端均开源,开发、部署文档完善,很适合监控设备接入和流媒体前端开发学习。
2.3 EasyDarwin
EasyDarwin是一个纯粹的RTSP流媒体服务,基于golang开发,部署简单,不依赖其他流媒体服务,结合ffmpeg可以实现HLS直播,配合开源的EasyPlayer实现Web端直播,是笔者目前主要使用的流媒体服务。
EasyDarwin开源地址:EasyDarwin开源地址
EasyPlayer Demo开源地址:EasyPlayer Demo开源地址
具体如何部署,参考EasyDwrwin地址即可,接下来说几个存在的问题以及解决方式(有些是临时解决方式)。
- 生成ts文件过多的问题
EasyDarwin运行一段时间会生成大量的ts切片,ts切片生成配置并没放出来,源码写死。
笔者目前临时解决方案:将下面脚本定时执行,每天凌晨清理一次,并重启EasyDarwin,则会重新生成在当天日期的文件夹,后续从源码改造,前端播放需要根据当前日期生成播放路径:http://IP:10008/record/{路径名称}/20230105/out.m3u8。
# 本地存储保存路径root_dir=/var/Streamingfile_name=$(date +%Y%m%d)current_dir=`pwd`easydarwin_dir=/opt/EasyDarwin# EasyDarwin重启后会以当天日期命名重新生成文件夹systemctl restart EasyDarwin_Service.servicefor i in $root_dir/*doif test -d $ithen# 由于我只需要直播,不需要回放,直接清理掉昨天的,需要保存的话挪到另一个文件夹即可cd $i && rm -rf `ls | grep -v "$file_name"`echo "$(date "+%Y-%m-%d %H:%M:%S") clean..." >> $current_dir/clean.logfidone# 每天凌晨执行# 0 0 * * * /opt/EasyDarwin/clean_ts.sh
- easyplayer.js播放问题
easyplayer算是一个基于videojs的HLS播放器,对应的播放地址:http://IP:10008/record/{路径名称}/20230105/out.m3u8。
使用官方demo的时候发现h265播放黑屏,不过在官方的演示地址和VLC是可以播放的,官方演示地址。
经测试,发现依赖文件EasyPlayer-element.min.js不同,把官方的依赖下载下来替换了demo中的依赖,按照说明部署即可,依赖下载地址。 - 要改进的问题
EasyDarwin添加rtsp通道地址很麻烦,需要一个一个加,如一个NVR,用户名密码是不变的,但是我们需要每个都拼接一次地址:rtsp://账号:密码@ip/Streaming/Channel/102,完全可以改成只添加一次NVR地址、用户、密码,然后再统一添加需要监控的通道。
2.4 m7s
m7s(Monibuca ),按作者的定义,是一个开源的Go语言实现的流媒体服务器开发框架,下图仓库分布就能看出来,二次开发接口很强,而且开源已经支持主流的协议。可以到官网下载直接安装,也可以参考文档编译运行,二次开发,后面要重点研究一下。
官网地址:m7s官网地址
开源地址:m7s开源地址