GB28181平台实现,支持摄像头公网WEB端直播
背景
28181协议全称为GB/T28181《安全防范视频监控联网系统信息传输、交换、控制技术要求》,是由公安部科技信息化局提出,由全国安全防范报警系统标准化技术委员会(SAC/TC100)归口,公安部一所等多家单位共同起草的一部国家标准(以下简称28181)。
28181协议在全国平安城市、交通、道路等监控中广泛采用,若想做统一的大监控平台,则支持28181协议接入是必不可少的。如今很多客户都是想在之前使用的28181平台的基础上进行拓展。
说明
LiveGBS GB28181流媒体服务器负责将GB28181设备/平台推送的PS流转成ES流,然后进行分发。
同时,LiveGBS 对外提供HTTP API接口,通过接口可以获知流媒体转发服务的运行状态信息,转发会话信息,服务器配置和版本信息等;
LiveGBS GB28181流媒体服务器提供以下功能:
1. 接受和处理GB28181接入服务器的推流请求(如有推流权限验证则调用验证服务器接口);
2. 接受和处理GB28181设备的推流;
3. 实时流媒体处理,PS(TS)转ES;
4. 推送ES流到EasyDSS流媒体服务器;
5. 接受和处理GB28181接入服务器的断开推流请求;
6. 对外提供服务器获取状态、信息,控制等http API接口;
LiveGBS流媒体直播详细流程
1 接入服务器发送Invite请求
接入服务器向流媒体服务器发送Invite请求,请求流媒体服务返回携带SDP 消息体,消息体中
描述了媒体服务器接收媒体流的IP、端口、媒体格式等内容;
Invite请求代码如下:
const options = {
serialServer: serialServer,
serialDevice: code,
method: common.SIP_INVITE,
contentType: common.CONTENT_NONE,
content: sdp,
host: hostip,
port: hostport,
rtpovertcp: (parseInt(rtpovertcp)===0?'UDP':'TCP')
};
console.log('inviteMediaServer......sendRequest' + JSON.stringify(options));
uas.sendRequest(options);
2 流媒体服务接受Invite请求处理并ACK应答
流媒体服务接受Invite请求,并在回调函数中处理请求,js代码如下:
uas.on('invite', async ctx => {
const request = ctx.request;
const content = JSON.parse(request.content);
const status = 200;
const serial = sip.parseUri(request.uri).user;
const host = config.server.serverHost;
let ssid = serial.substring(16,20);// PrefixInteger(sessionid,4);
let sirialid = serial.substring(3,8);
const ssrc = "0"+sirialid+ssid;
console.log("ssrc = "+ssrc);
let sdp = '';
//如果已存在
let bHas = this.session_.has(serial);
console.log(bHas);
if (bHas) {
console.log('this.session_ has exist serial: '+serial);
sdp = '';
}
else{
let port = config.server.udpPort;//流媒体接收TCP端口
let transport = 'RTP/AVP';
let a = "a=recvonly\r\n";
if(content.rtpovertcp === 'TCP' )
{
port = config.server.tcpPort;//流媒体接收TCP端口
transport = 'TCP/RTP/AVP';
a = "a=recvonly\r\na=setup:passive\r\n";
}
sdp = "v=0\r\n" +
`o=${serial} 0 0 IN IP4 ${host}\r\n` +
"s=Play\r\n" +
`c=IN IP4 ${host}\r\n` +
"t=0 0\r\n" +
`m=video ${port} ${transport} 96 98 97\r\n` +
"a=rtpmap:96 PS/90000\r\n" +
"a=rtpmap:98 H264/90000\r\n" +
"a=rtpmap:97 MPEG4/90000\r\n" +
`${a}`+
//`a=connection:new\r\n` +
`y=${ssrc}\r\n`;
// A new channel is coming, delete the old
rtpserver.deleteChannels(parseInt(ssrc));
// Create a new stram,and add to redis
this.registerStream(parseInt(ssrc),uuidv4(),true);
}
let response = sip.makeResponse(request, status, common.messages[status]);
uas.sendAckEx(response, sdp);
});
如上代码所示,我们在SDP消息体中提供了两种流传输方式,分别是TCP和UDP,通过Invite请求所带的 “rtpovertcp ”参数来控制,TCP方式因为其不丢包的传输方式在GB28181设备推流到公网服务器的方案中得以广泛应用,然而,目前市面上的多数支持国标的设备都不支持tcp模式推流,udp仍然是主流的推流方式,不过,经测试udp推流方式在公网应用中效果比较差,需要进一步优化或者改进。
3 接入服务器接收ACK应答并Invite请求设备开始推流
回调函数中ack应答处理js代码如下:
uas.once('ack', async ctx => {
const request = ctx.request;
const callId = request.headers['call-id'];
if (request.content.length > 0 )
{
const serial = serialDevice;//sip.parseUri(request.headers.from.uri).user;
let response ;
if(!this.session_.has(callId))
{
response = await this.inviteDevice(serial, code, callId, request.content);
//Invite Device is complete
if(response != undefined)
{
if(response.content)
{
const transform = require('sdp');
const res = transform.parse(response.content);
console.log(res.media[0].protocol);
if((res.media[0].protocol === 'RTP/AVP'&&parseInt(rtpovertcp)===0) ||
(res.media[0].protocol === 'TCP/RTP/AVP'&&parseInt(rtpovertcp)===1) ){
if (response.status === 200 )
{
//send ack to stream server
this.ackMediaServer(response.status,request,request.content);
this.session_.set(callId, response);
}
}
else{
response.status = 700;
}
}
console.log('inviteMediaServer ack is coming.......response='+JSON.stringify(response));
}
resolve(response);
}
else{
console.log('inviteMediaServer this.session_.has: '+callId);
}
}
});
如上代码所示,在InviteDevice请求完成后,我们在返回Response处理过程中做过一次特殊处理,即:如果TCP拉流时发现设备拉流应答中返回其推流模式依然是'RTP/AVP'的UDP模式,我们认为其设备不支持TCP模式,从而向上层返回700,不支持的流媒体传输方式。
4 Invite设备正常返回200应答并传递给流媒体服务器
代码在第3点中有所体现。
5 流媒体服务接受拉流请求成功应答
uas.on('ack', async ctx => {
const request = ctx.request;
if (request.content.length === 0) {
return;
}
const serial = sip.parseUri(request.headers.from.uri).user;
this.session_.set(serial, request);
const ssrc = serialTossrc(serial);
// resole a new stram,and refresh to redis
const info = JSON.parse(await redis.get(`stream:${parseInt(ssrc)}`));
this.registerStream(parseInt(ssrc),info.uuId,false);
});
至此,整个拉流过程已经完成。
获取更多信息
下载:https://www.liveqing.com/docs/download/LiveGBS.html
GB28181平台实现,支持摄像头公网WEB端直播的更多相关文章
- Yearning v1.3.0 发布,Web 端 SQL 审核平台
企业级MYSQL web端 SQL审核平台. Website 官网 www.yearning.io Feature 功能 数据库字典自动生成 SQL查询 查询工单 导出 自动补全,智能提示 查询语句审 ...
- 《物联网框架ServerSuperIO教程》-22.Web端对传感器实时监测与控制。附:v3.6.8版本,支持WebSocket
1.ServerSuperIO v3.6.8更新内容 1.1 增加WebSocket服务端功能,支持自控模式.并发模式.单例模式,不支持轮询模式1.2 接收数据缓存与现有的IO实例分离.1.3 优化代 ...
- 关于emoji表情,支持在app端发送web端显示,web端发送给app端显示,web与wap端互相显示。
要用到emoji.js和emoji.jquery.js两个插件配合实现三端互通. 1.app端发送的emoji表情----到服务器---服务器存储的是‘问号’,无法显示如图所示: 后台的同学也试验了网 ...
- 【miscellaneous】海康威视监控摄像头实现web端无插件监控实拍效果
[rtsp]海康威视监控摄像头实现web端无插件监控实拍效果 详细介绍参见:http://live.cuplayer.com/RtspCameraLive.html web端无须装插件(支持PC,安卓 ...
- 移动web端的react.js组件化方案
背景: 随着互联网世界的兴起,web前端开发的方式越来越多,出现了很多种场景开发的前端架构体系,也对前端的要求日益增高,早已经不是靠一个JQuery.js来做前端页面的时代了,而今移动端变化最大,近 ...
- Comet技术详解:基于HTTP长连接的Web端实时通信技术
前言 一般来说,Web端即时通讯技术因受限于浏览器的设计限制,一直以来实现起来并不容易,主流的Web端即时通讯方案大致有4种:传统Ajax短轮询.Comet技术.WebSocket技术.SSE(Ser ...
- 腾讯云点播视频存储(Web端视频上传)
官方文档 前言 所谓视频上传,是指开发者或其用户将视频文件上传到点播的视频存储中,以便进行视频处理.分发等. 一.简介 腾讯云点播支持如下几种视频上传方式: 控制台上传:在点播控制台上进行操作,将本地 ...
- 数据採集之Web端上传文件到Hadoop HDFS
前言 近期在公司接到一个任务.是关于数据採集方面的. 需求主要有3个: 通过web端上传文件到HDFS; 通过日志採集的方式导入到HDFS; 将数据库DB的表数据导入到HDFS. 正好近期都有在这方面 ...
- IPMI相关漏洞利用及WEB端默认口令登录漏洞
IPMI相关漏洞 0套件漏洞 使用0套件时,只需要Username,口令任意即可绕过身份鉴别执行指令.而且一般还有一个默认的账户admin或者ADMIN. 备注:IPMI是一套主机远程管理系统,可以远 ...
- Skyline Web 端数据浏览性能优化
三维数据的效率一直是个瓶颈,特别是在Web端浏览一直是个问题,在IE内存限制1G的条件下,对于三维数据动不动几十G的数据量,这1G显得多么微不足道.虽然现在三维平台都是分级加载,或者在程序中采用数据分 ...
随机推荐
- Centos Yum源配置(清华源)
配置清华源 执行清华源官方语句https://mirrors.tuna.tsinghua.edu.cn/help/centos/?repo=centos7替换当前文件并备份 请注意,CentOS 8( ...
- HZOI NOIP 2024 Round 24 T2 取石子 官方做法
发现大多数的题解都是不同于官方题解的做法,这里我将介绍官方题解做法. Solution 证明先手是否可以必胜的方法相差无几,为了方便后边行文,这里介绍我的思路:考虑各堆石子和为奇数的情况(以下简称为& ...
- Xamarin.Android - 防止 AlertDialog 在 PositiveButton 的使用方法
https://www.coder.work/article/399382 var builder = new AlertDialog.Builder(this); View v = LayoutIn ...
- C# WInFomr 窗体圆角
#region 设置窗体圆角 /// <summary> /// 设置窗体圆角 /// </summary> /// <param name="f"& ...
- 前端开发系列060-网络篇之浏览器、HTML和内核(引擎)
一.浏览器的发展和特性 浏览器的发展 浏览器的历史并不长,即便到今天来算也只有短短的27年,下面列出浏览器历史中的重要节点. Tim Berners-Lee 在80年代末期90年代初期发明了世界上第一 ...
- WD 笔试 反思 记录
1.从 1 2 3 4 5 6 7 8 9从中选择至少一个,乘积的种类有多少种 转:解题思路http://www.nowcoder.com/questionTerminal/65c51812549 ...
- vim 快速在一行的前面加上# // 之类的东西
首先切换到大写的模式 然后ctrl + v 选中自己想注释的行.上下方向键盘 然后 按i 然后输入自己想要的 东西 然后esc 就输入了
- 关于 var 目录磁盘空间不足的解决方案
参考博客 博客
- java 利用反射调试GUI
简介 java核心编程个出的代码只要通过 EventTrace tracer = new EventTracer(); tracer.add(frame) 就可以跟踪事件了 code /* * @Au ...
- USB3.0 PHY方案(FT601Q)在 FPGA上的速率验证
一.背景 高通量在体神经信号采集系统,随着通道数增加.增加实时刺激需求等,采用以太网传输面临带宽极限,亟需一种更快的传输介质. 目前以太网的带宽极限:实测800Mbit/s左右,[移植并使用Iperf ...