项目名称 | 项目描述 | 项目地址 |
---|---|---|
wvp-GB28181-pro | 一个基于GB28181-2016标准实现的网络视频平台,支持NAT穿透,支持海康、大华、宇视等品牌的IPC、NVR、DVR接入。支持国标级联,支持rtsp/rtmp等视频流转发到国标平台,支持rtsp/rtmp等推流转发到国标平台。 | https://github.com/648540858/wvp-GB28181-pro.git 国内:https://gitee.com/pan648540858/wvp-GB28181-pro.git |
ZLMediaKit | 基于C++11开发,避免使用裸指针,代码稳定可靠,性能优越。支持多种协议(RTSP/RTMP/HLS/HTTP-FLV/WebSocket-FLV/GB28181/HTTP-TS/WebSocket-TS/HTTP-fMP4/WebSocket-fMP4/MP4/WebRTC),支持协议互转 | https://github.com/ZLMediaKit/ZLMediaKit.git |
打包前注意事项:
ZLMediaKit是用c 和 c++ 编写的,所以打包工具使用Visual Studio 2017 或 >2017版本,我本地使用的是Visual Studio 2019
ZLMediaKit目录下3rdpart(第三方包)文件夹下ZLToolKit和media-server需从另外两个git项目上拉取, 如果没有拉取这两个文件夹下面是空的,在编译的时候会报错,提示找不到文件。使用到的第三方包地址:
ZLToolKit
media-server
打开 Visual Studio ,选择打开本地文件夹,然后选择从github拉取的ZLMediaKit文件夹打开,打开过程中可能需要加载一会
打开后界面如下,然后选择CMake概述页下面的打开CMake设置编辑器
打开CMake设置编辑器界面如下,默认配置类型是Debug
,我们先用默认配置,然后按Ctrl+S
保存,此时右侧窗口会出现编辑打印日志,出现CMake生成完毕,表示编译成功
编译完成后我们开始打包生成可执行文件,在最上面菜单栏生成
选项下选择全部生成
,开始打包
最右边窗口出现全部生成 已成功,表示打包完成,打包后的可执行文件在 ZLMediaKit\release\windows64\Debug
文件夹下,MediaServer.exe
就是流媒体启动的服务。
注意:在打包过程中可能会出现编译器堆空间不足时,此时尽量关闭其他服务程序,保证内存足够,再次尝试打包
在打包后的文件夹中找到MediaServer.exe可执行文件,双击运行,与此同时会生成config.ini配置文件。
启动成功:
生成config.ini配置文件
接下来,用记事本打开config.ini
配置文件,找到[http]
下面的port
配置,默认为80
,如果80端口被占用,可以修改成其他端口,我这里设置成9980,别的配置先默认,更多配置说明可以参考ZLMediaKit\conf
下面的config.ini
,这里说明和配置更全面,可以参考:
; auto-generated by mINI class { [api] apiDebug=1 defaultSnap=./www/logo.png secret=035c73f7-bb6b-4889-a715-d9eb2d1925cc snapRoot=./www/snap/ [ffmpeg] bin=E:\installPackage\ffmpeg-n4.4-78-g031c0cb0b4-win64-gpl-4.4\bin\ffmpeg.exe cmd=%s -re -i %s -c:a aac -strict -2 -ar 44100 -ab 48k -c:v libx264 -f flv %s log=./ffmpeg/ffmpeg.log snap=%s -i %s -y -f mjpeg -t 0.001 %s [general] addMuteAudio=1 enableVhost=0 enable_audio=1 flowThreshold=1024 fmp4_demand=0 hls_demand=0 maxStreamWaitMS=15000 mediaServerId=FxfnytvGJgXxECu6 mergeWriteMS=0 modifyStamp=0 publishToHls=1 publishToMP4=0 resetWhenRePlay=1 rtmp_demand=0 rtsp_demand=0 streamNoneReaderDelayMS=20000 ts_demand=0 unready_frame_cache=100 wait_add_track_ms=3000 wait_track_ready_ms=10000 [hls] broadcastRecordTs=0 deleteDelaySec=0 fileBufSize=65536 filePath=./www segDur=2 segNum=3 segRetain=5 [hook] admin_params=secret=035c73f7-bb6b-4889-a715-d9eb2d1925cc alive_interval=30.000000 enable=0 on_flow_report= on_http_access= on_play= on_publish= on_record_mp4= on_record_ts= on_rtsp_auth= on_rtsp_realm= on_server_keepalive= on_server_started= on_shell_login= on_stream_changed= on_stream_none_reader= on_stream_not_found= timeoutSec=10 [http] charSet=gb2312 dirMenu=1 keepAliveSecond=15 maxReqSize=40960 notFound=<html><head><title>404 Not Found</title></head><body bgcolor="white"><center><h1>您访问的资源不存在!</h1></center><hr><center>ZLMediaKit(git hash:50c6c251,branch:master,build time:Dec 15 2021 15:46:09)</center></body></html> port=9980 rootPath=./www sendBufSize=65536 sslport=443 virtualPath= [multicast] addrMax=239.255.255.255 addrMin=239.0.0.0 udpTTL=64 [record] appName=record fastStart=0 fileBufSize=65536 filePath=./www fileRepeat=0 fileSecond=3600 sampleMS=500 [rtmp] handshakeSecond=15 keepAliveSecond=15 modifyStamp=0 port=1935 sslport=19350 [rtp] audioMtuSize=600 rtpMaxSize=10 videoMtuSize=1400 [rtp_proxy] dumpDir= port=10000 timeoutSec=15 [rtsp] authBasic=0 directProxy=1 handshakeSecond=15 keepAliveSecond=15 port=554 sslport=332 [shell] maxReqSize=1024 port=9000 ; } ---
这一步完成后,ZLMediaKit编译和打包的基本操作就完成了,可以满足基本应用,如果有更深层次的可以查看ZLMediaKit wiki
拉取完成后,在wvp-GB28181-pro文件夹下有个sql文件夹,里面存放了该项目的数据库结构(mysql.sql),在数据库管理软件,如navicat中运行mysql.sql,运行完成后会生成一个名为wvp的数据库,默认的登录用户: admin,密码:admin
表名 | 描述 |
---|---|
device | 设备表,主要存放GB对接过来的设备 |
device_alarm | 设备告警信息 |
device_channel | 设备下的通道信息(每个设备查看视频的主要信息表) |
device_mobile_position | 移动设备的坐标信息表 |
gb_stream | 国标平台流信息 |
log | 日志表 |
media_server | 流媒体服务信息表 |
parent_platform | 上级平台 |
platform_gb_channel | 上级平台通道表 |
platform_gb_stream | 上级平台流信息表 |
role | 权限表 |
stream_proxy | 流代理表 |
stream_push | 推流表 |
user | 用户表 |
spring: # REDIS数据库配置 redis: # [必须修改] Redis服务器IP, REDIS安装在本机的,使用127.0.0.1 host: 127.0.0.1 # [必须修改] 端口号 port: 6379 # [可选] 数据库 DB database: 6 # [可选] 访问密码,若你的redis服务器没有设置密码,就不需要用密码去连接 password: # [可选] 超时时间 timeout: 10000 # [可选] jdbc数据库配置, 项目使用sqlite作为数据库,一般不需要配置 datasource: # 使用mysql 打开23-28行注释, 删除29-36行 # name: wvp # url: jdbc:mysql://127.0.0.1:3306/wvp?useUnicode=true&characterEncoding=UTF8&rewriteBatchedStatements=true # username: # password: # type: com.alibaba.druid.pool.DruidDataSource # driver-class-name: com.mysql.cj.jdbc.Driver name: wvp url: jdbc:mysql://127.0.0.1:3306/wvp?useUnicode=true&characterEncoding=UTF-8&serverTimezone=GMT%2B8 username: root password: admin type: com.alibaba.druid.pool.DruidDataSource driver-class-name: com.mysql.cj.jdbc.Driver # [可选] WVP监听的HTTP端口, 网页和接口调用都是这个端口 server: port: 9970 # 作为28181服务器的配置 sip: # [必须修改] 本机的IP ip: 127.0.0.1 # [可选] 28181服务监听的端口 port: 9960 # 根据国标6.1.2中规定,domain宜采用ID统一编码的前十位编码。国标附录D中定义前8位为中心编码(由省级、市级、区级、基层编号组成,参照GB/T 2260-2007) # 后两位为行业编码,定义参照附录D.3 # 3701020049标识山东济南历下区 信息行业接入 # [可选] domain: 3714810000 # [可选] id: 3714810000111000999 # [可选] 默认设备认证密码,后续扩展使用设备单独密码, 移除密码将不进行校验 password: # [可选] 心跳超时时间, 建议设置为心跳周期的三倍 keepalive-timeout: 180 # [可选] 国标级联注册失败,再次发起注册的时间间隔。 默认60秒 register-time-interval: 60 #zlm 默认服务器配置 media: # [必须修改] zlm服务器的内网IP ip: 127.0.0.1 # [可选] 返回流地址时的ip,置空使用 media.ip #stream-ip: 192.168.1.68 # [可选] wvp在国标信令中使用的ip,此ip为摄像机可以访问到的ip, 置空使用 media.ip #hook-ip: 192.168.1.68 # [可选] wvp在国标信令中使用的ip,此ip为摄像机可以访问到的ip, 置空使用 media.i #sdp-ip: 192.168.1.68 # [必须修改] zlm服务器的http.port http-port: 9980 # [可选] zlm服务器的hook.admin_params=secret secret: 035c73f7-bb6b-4889-a715-d9eb2d1925cc # 启用多端口模式, 多端口模式使用端口区分每路流,兼容性更好。 单端口使用流的ssrc区分, 点播超时建议使用多端口测试 rtp: # [可选] 是否启用多端口模式, 开启后会在portRange范围内选择端口用于媒体流传输 enable: true # [可选] 在此范围内选择端口用于媒体流传输, port-range: 26100,26899 # [可选] 国标级联在此范围内选择端口发送媒体流, send-port-range: 26100,26899 # 端口范围 # 录像辅助服务, 部署此服务可以实现zlm录像的管理与下载, 0 表示不使用 record-assist-port: 18081 # [可选] 日志配置, 一般不需要改 logging: file: name: logs/wvp.log max-history: 30 max-size: 10MB total-size-cap: 300MB level: com.genersoft.iot: debug com.genersoft.iot.vmp.storager.dao: info com.genersoft.iot.vmp.gb28181: info # [根据业务需求配置] user-settings: # 推流直播是否录制 record-push-live: true auto-apply-play: false # 点播等待超时时间,单位:毫秒 play-timeout: 16000 # 在线文档: swagger-ui(生产环境建议关闭) swagger-ui: enabled: true # 版本信息, 不需修改 version: version: "@project.version@" description: "@project.description@" artifact-id: "@project.artifactId@"
注意:配置中 meida.http-port
端口必须和ZLMediaKit
中config.ini
配置中[http]
下面的port
一致,否则推流和拉流会接收不到
配置文件配置完成后,开始启动项目,项目启动成功后会连接ZLMediaServer,如果ZLMediaServer没有启动,会一直重连
当我们启动ZLMediaKit流媒体服务后,打印连接成功
前端文件在wvp-GB28181-pro目录下web_src文件夹下,我们在web_src
下打开命令行窗口,并执行npm install
, 安装前端依赖包,执行完成后,等待依赖加载完成
依赖加载完成后,执行npm run dev, 在开发环境下启动前台, 启动成功后在控制台会打印出前台地址,在浏览器访问这个地址
访问成功后在登录页输入用户名和密码登录,账号密码默认均为admin
,登录成功后进入首页
如果你是上级平台,需要把下面一些配置提供给下级平台,让下级平台推流过来,这些配置是在wvp-GB28181-pro后台配置文件中sip
配置节点下配置的
#SIP 信令服务 1)IP: 192.168.1.143 2)port: 9960 3)domain: 3714810000 4)id: 3714810000111000001
如果是前后台分离,前台需单独打包,放在如nginx下,具体wvp-GB28181-pro更多配置细节可以查看wiki
以上就是整个基于wvp-GB28181-pro+ZLMediaKit实现的GB28181-2016流媒体的具体操作步骤。