一、前言说明
与视频监控onvif调试助手同,此次主更乃收发数据之打印,昔者以表格显之,每包数据繁复,欲寻其弊,辄须滚轴寻之甚久。今悉改为表格式,以异色字显,若欲详察,但双击其行即可,省时良多。因吾外接多国标设备,数据时如潮涌,更可设滤条以显所需。
异者,此工具亦多非开发者用之。今监控设备皆需支持国标gb28181,欲验其正,辄先用简器调试。尤重兼容,28181标准文于规范之述未尽详,致诸厂实现或有出入,甚者不合规。如点播视频时,指定ssrc,而诸厂设备竟无ssrc,此须服务端兼容。吾器能打印每条收发数据,易寻易析其弊。
有著名国标系统wvp,众皆用之,BS架构网页,可直供公网,功能宏富,然其弊,文件体积甚巨,部署维艰,调试亦难。吾之绿色版,双击即用,兼容无方,凡安卓、国产Linux系统及嵌入式板皆可,而wvp受制颇多,搭建调试,非专业者莫能为也。
二、效果图


三、相关地址
- 国内站点:https://gitee.com/feiyangqingyun
- 国际站点:https://github.com/feiyangqingyun
- 个人作品:https://blog.csdn.net/feiyangqingyun/article/details/97565652
- 文件地址:https://pan.baidu.com/s/1d7TH_GEYl5nOecuNlWJJ7g 提取码:01jf 文件名:bin_video_28181
四、功能特点
- 支持设备注册、注销、心跳、校时、注册认证、注销认证等。
- 设备上线后可以手动获取设备状态、设备信息、配置信息、预置位信息等。
- 设备上线后自动获取设备通道信息,包括中文通道名称。识别到通道上线离线变化,会重新获取该设备的所有通道信息。
- 支持视频点播,可以分别点播主码流和子码流,内置rtp解包线程,解包后发给视频播放组件解码播放。
- 每个设备每个通道支持点播多个视频,通过ssrc区分,支持共用端口和不同端口收流。
- 支持对某个设备下面所有通道、某个通道、某个通道对应的某个流分别关闭。
- 可查录像,可回放,控之有术:可暂歇,可续行,可疾徐,可易节。
- 可下录像,可疾下,如八倍之速,可并途而众下。
- 回放与下载,皆通IPC与NVR:如摄镜自载之SD录,NVR之硬盘录,皆可回放。
- 可控云台,上之下之,左之右之,左上右上,左下右下,皆可移;镜可缩放,光可调,焦可聚散。
- 可查可调可增可改可删预置之位。
- 自订目录,通上下皆示警。
- 内置时读之制,以保通道之新,如NVR之频更。
- 内置警讯与位移侦测之能,既订其事,运动之兆、侵越之警、流连之兆等,皆自上之。
- 兼有音语对答之术,可直点视窗浮条之音语钮,再点则闭,对语之际,浮条恒显。
- 亦能设防撤防,既设,警讯自上之。
- 国标之务,兼通UDP与TCP之道,可择独听其一,或并听之,TCP之道自能理粘包之患。
- 国标取流,亦通UDP、TCP受动、TCP主动三途,每道皆可自择取流之方。
- 内置取流之端口池,每取一,闭流则自还其号,复用之。
- 受流之端口,自能纠谬,跃过被占之号,不至因端口占而致受流之败。
- 能自辨三法取流,离线则重连,重连后自启点播拉流。
- 录影回放,一完即换,直至毕。可八倍速回放。
- 视播放自适硬解,耗资微,实时甚佳,悬条示流讯,可单击悬条存录影于本。
- 能容千路国标交涉并作,实时视流可同显六十四路,可拓更多路。
- 容阿里云等云主,可分设内网监听址与外网访问址,云主上监听用内网,对外用外网址。
- 容视分,即推流,视通则自推至流媒主,他需处拉流即可,容rtsp、rtmp、hls、webrtc等拉流。
- 视频分发,亦称推流分发,以表格形式显其流之动态,列其统计,示何流为几处所引,如二地以RTSP启流,则RTSP列显数二,昭然若揭,明其引流之多寡。
- 视频分发,能于无人观时,自闭推流与点播,以节带宽之用,久无人视,何须点播引流与推流?于后台服务之制,通道推流自复,若该通道已存点播推流,则复用此流,不复另点,以省资源。
- 设后台服务之能,定一私约,依此私约互应,支持TCP、HTTP、MQTT等式交互,便第三方程接入集成。通信之约甚备,可获设备之列、指定通道视频之址、云台之控、预置位之操、录像之询、录像之回、录像之下载、回放之倍速等控、警情之讯、视频之点与闭。
- 支持注册重定向,便负载均衡与区域化之布,可容数十万设备之连,无碍。
- 可摄图像,得设最多十帧之限,亦能定摄间之距,摄得之图,将以信通知。
- 实时预览与录像回放,皆可推流,推流能加文辞与图像之印,及ffmpeg所支之种种滤镜,可并加多印。
- 能联诸国标平台之上域,如easygbs、livegbs、海康大华国标平台,上域联于本软件,自能解资源之录。
- 可启共设之器,常开,俾于udp式处理sip交互之际,tcp式能受平台推之资源录与录像文书之讯。
- 应器速至,无需久候,但有一讯,无论受注册之令、心跳之令、推之令等,皆能即得或解器之讯与通道之讯,速至上线。
- 亦支gb28181-2011、gb28181-2016、gb28181-2022,及后或所有之协议版。
- SIP之解析与交互,纯Qt底层代码为之,udp/tcp通信交互,祖传原创代码解析,不假外求。
- 代码量寡,gb28181交互部分仅数千行,注释详备,接口和易,使用至简,提供详尽使用之例。
- 支持海康、大华、宇视、华为、天地伟业等国标设备,兼及无ssrc之设备。
- 支持Qt诸版本及编译器、操作系统,不限乎win、linux、mac、android、嵌入式linux、树莓派香橙派、国产os等。
五、相关代码
2.0 基本步骤
- 首事,将core_gb28181server、core_gb28181rtp及core_gb28181widget目录,移置尔项目上一级目录。
- 次之,启项目之pro文,引gb28181之件,include ($$PWD/../core_gb28181server/core_gb28181server.pri) 与 include ($$PWD/../core_gb28181rtp/core_gb28181rtp.pri) 并 include ($$PWD/../core_gb28181widget/core_gb28181widget.pri)。
- 复之,于码文引入相应首文,#include "gb28181server.h",用此码。
- core_gb28181server司信令之析与交,core_gb28181rtp司rtp之解,core_gb28181widget司视频之显,解码固用core_videomdk之件,此件以ffmpeg开之。亦能易为core_videoffmpeg之件。
- 为便用计,特制GB28181Widget类,专司国标流之预览、回放、下载,非显不触绘,无虑耗系资源,此亦可用以推流。
2.1 启动服务
//实例化国标服务类
GB28181Server *server = new GB28181Server;
//设置需要的参数
GB28181ServerPara para;
//国标编码
para.serverId = "34020000002000000001";
//区域编码
para.serverRealm = "3402000000";
//外网地址/设备端填写的服务器地址就是这个地址/如果是本地则和监听地址相同
para.serverHost = "192.168.0.110";
//监听地址
para.serverIp = "192.168.0.110";
//监听端口
para.serverPort = 15060;
//认证密码/为空的话则不启用认证
para.serverPwd = "12345678";
//查询通道信息的间隔/0表示不启用/单位秒
para.queryInterval = 0;
server->setServerPara(para);
//启动服务/udp和tcp同时监听
server->start(ListenMode_Both);
//绑定信号接收数据
//设备上下线
connect(server, SIGNAL(deviceChanged(QString, bool)), this, SLOT(deviceChanged(QString, bool)));
//通道变化
connect(server, SIGNAL(channelChanged(QString, QList<GB28181Channel>)), this, SLOT(channelChanged(QString, QList<GB28181Channel>)));
//警情上报
connect(server, SIGNAL(receiveEvent(GB28181Event)), this, SLOT(receiveEvent(GB28181Event)));
//媒体状态变化
connect(server, SIGNAL(receiveStatus(GB28181Status)), this, SLOT(receiveStatus(GB28181Status)));
//返回预置位信息
connect(server, SIGNAL(receivePreset(QList<GB28181Preset>)), this, SLOT(receivePreset(QList<GB28181Preset>)));
//返回录像文件信息
connect(server, SIGNAL(receiveRecord(QList<GB28181Record>)), this, SLOT(receiveRecord(QList<GB28181Record>)));
//停止服务
server->stop();