Android前端音视频数据接入GB28181平台意义

技术背景

在我们研发Android平台GB28181前端音视频接入模块之前,业内听到最多的是,如何用Android或者Windows端,在没有国标IPC设备的前提下,模拟GB28181的信令和媒体流交互流程,实现GB28181整体方案的测试?

Android端真的没有必要做个支持GB28181的接入模块?

如果说做一个设备端IPC国标设备接入模拟模块是完成从0到1的工作,那么从设备端模拟IPC到一个可以产品化的Android平台GB28181前端音视频接入模块,需要更严谨更符合相关spec的方式,实现不具备国标音视频能力的Android终端,通过平台注册的形式,接入到现有的GB28181服务,最终用于如智能监控、智慧零售、智慧教育、远程办公、生产运输、智慧交通、车载或执法记录仪等场景,可以说应用场景非常广泛。

除了支持常规的音视频媒体流数据接入外,还可以支持Subscribe订阅实时位置(MobilePosition)、实时目录查询等,完成标准服务的对接。产品设计方面,媒体流支持最新GB28181-2016的UDP和TCP被动模式,参数配置,支持注册有效期、心跳间隔、心跳间隔次数、TCP/UDP信令设置,支持RTP Sender IP地址类型、RTP Socket本地端口、SS-R-C、RTP socket 发送Buffer大小、RTP时间戳时钟频率设置,支持注册成功、注册超时、INVITE、ACK、BYE状态回调。

设计思路

信令设计和媒体数据传输分离,上层实现国标GB28181的注册、注销、CATALOG、INVITE、ACK、BYE、SUBSCRIBE等交互处理,如注册成功后,返回注册时间,并检测传输或心跳等异常状态,服务端发送catalog请求后,组织本地catalog信息,并以message的形式发送到服务端,服务端收到相关信息后,开始发送invite请求,客户端解析INVITE返回的SDP信息,组织相关的response,创建RTP Sender,根据返回的信息,设定相关参数。待收到服务端的Ack后,发送编码、打包后的媒体流数据。在此期间,按照设定间隔,定时发送keepalive。

如上图所示,模块除了常规的音视频参数配置外,系统可同时亦或单独实现如RTMP推送、RTSP推送、轻量级RTSP服务、实时录像、GB28181前端接入。

信令接口设计:

public interface GBSIPAgent {void addListener(GBSIPAgentListener listener);/** 设置SIP本地链接地址* @param address 本地IP地址, 如192.168.0.111* @param port本地SIP端口, 如 15070*/void setLocalAddressInfo(String address, int port);/** 设置SIP Server配置参数* @param address SIP服务器地址, 如 192.168.0.101* @param port SIP服务器端口, 如 15060* @param id SIP服务器ID, 如 34020000002000000001* @param domain SIP服务器域, 如 3402000000*/void setServerParameter(String address, int port, String id, String domain);/** 设置GB28181 SIP User配置参数* @param userName SIP用户名, 如 34020000001110000045* @param password 如 123456*/void setUserInfo(String userName, String password);/** 设置SIP请求头中的UserAgent* @param userAgent用户代理*/void setUserAgent(String userAgent);/** 设置SIP传输协议* @param transport_protocol, 设置SIP信令传输协议: UDP, TCP, 默认是UDP*/void setTransportProtocol(String transport_protocol);/** 设置GB28181配置参数* @param regExpired 注册有效期, 单位: 秒, 如 3600* @param heartBeatInterval 心跳间隔, 单位: 秒, 默认60* @param heartBeatCount 心跳超时次数, 默认3次*/void config(int regExpired, int heartBeatInterval, int heartBeatCount);void clearDevices();boolean addDevice(Device device);boolean initialize();/**启动*/boolean start();boolean isRunning();/**响应Invite play 200OK*/boolean respondPlayInviteOK(String deviceId, String localAddress, int localPort);/**响应Invite play其他状态码*/boolean respondPlayInvite(int statusCode, String deviceId);/**终止会话*/void terminatePlay(String deviceId, boolean isSendBYE);/**终止所有会话*/void terminateAllPlays(boolean isSendBYE);/**停止*/void stop();void unInitialize();
}

相关状态回调:

public interface GBSIPAgentListener
{/*注册成功* @param dateString: 服务器日期,用来矫正设备端时间,用户自行决定是否矫正设备时间*/void ntsRegisterOK(String dateString);/**注册超时*/void ntsRegisterTimeout();/**注册网络传输曾异常*/void ntsRegisterTransportError(String errorInfo);/**心跳达到异常次数*/void ntsOnHeartBeatException(int exceptionCount, String lastExceptionInfo);/**收到s=Play的实时视音频点播*/void ntsOnInvitePlay(String deviceId, InvitePlaySessionDescription sessionDescription);/**发送play invite response 异常*/void ntsOnPlayInviteResponseException(String deviceId, int statusCode, String errorInfo);/** 收到CANCEL play INVITE请求*/void ntsOnCancelPlay(String deviceId);/** 收到Ack*/void ntsOnAckPlay(String deviceId);/** 收到Bye*/void ntsOnByePlay(String deviceId);/** Play会话对应的对话终止, 一般不会出发这个回调,目前只有在响应了200K, 但在64*T1时间后还没收到ACK,才可能会出发收到这个, 请做相关清理处理*/void ntsOnPlayDialogTerminated(String deviceId);
}

总结

Android平台GB28181音视频接入模块研发之前,大牛直播SDK(官方)已经在RTSP、RTMP和音视频采集、编码传输等有了多年积累,GB28181接入,对我们来说,只是在现有架构的基础上,完成信令交互和数据打包传输(H264, H265打包成PS流,然后拆成RTP包发送即可),RTP传输支持TCP、UDP模式,配合国标28181服务器测试,延时非常低,设计支持多通道,可实现RTSP或RTMP流数据到GB28181的转换。为Android平台赋能,像支持GB28181协议的IPC一样,方便的把摄像头、屏幕、麦克风或外部RTSP、RTMP流,顺利接入到GB28181平台。

 

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/553024.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

QQ浏览器怎样在首页显示优先推荐的网站

QQ浏览器怎样在首页显示优先推荐的网站?QQ浏览器显示优先推荐的网站的方法 1,在手机桌面上找到QQ浏览器的图标,点击打开。 QQ浏览器怎样在首页显示优先推荐的网站?QQ浏览器显示优先推荐的网站的方法[多图] 2,点击下…

push_back还是emplace_back?

背景和区别 emplace_back() 是 C11 之后,vector容器中添加的新方法,和 push_back()一样,都是在容器末尾添加一个新的元素,相对于push_back函数,它减少了一次类的构造。不同的是emplace_back() 在效率上相比较于 push_…

std::tuple还是struct?

std::tuple是C11提供的新模板类,可以翻译为“元组”,可把多个不同类型的变量组合成一个对象。std::tuple可看做std::pair的泛化实现,std::pair包含两个元素,std::tuple 可以同时包含多个元素,它拥有 struct 的表现&…

微软发动图明示新一代操作系统Windows 11

可能感到关注度不够,微软再次出面预热所谓的新一代Windows操作系统,阿拉伯数字“11”图形赫然出现在预热动图中,可以说暗示得不要再明显了。 值得注意的是,动图中11的两个1中间还有一位正打坐的小人,配合微软关注大脑…

std::atomic和std::mutex区别

​std::atomic介绍​ ​模板类std::atomic是C11提供的原子操作类型&#xff0c;头文件 #include<atomic>。​在多线程调用下&#xff0c;利用std::atomic可实现数据结构的无锁设计。​​ ​和互斥量的不同之处在于&#xff0c;std::atomic原子操作&#xff0c;主要是保…

C++ std::remove/std::remove_if/erase用法探讨

​std::remove 不会改变输入vector/string的长度。其过程相当于去除指定的字符&#xff0c;剩余字符往前靠。后面的和原始字符保持一致。​ 需要注意的是&#xff0c;remove函数是通过覆盖移去的&#xff0c;如果容器最后一个值刚好是需要删除的&#xff0c;则它无法覆盖掉容器…

深度技术Win11 64位最新旗舰版镜像V2021.08

深度技术Win11 64位最新旗舰版镜像V2021.08是微软最新版本的电脑操作系统&#xff0c;系统稳定性的进一步优化和提升&#xff0c;可以更好的获得整个纯版本系统的稳定性。支持系统智能激活服务&#xff0c;用户可以快速激活系统&#xff0c;提高系统使用率&#xff0c;有需要的…

再谈NULL和nullptr(C++11)区别

在谈NULL和nullptr区别之前&#xff0c;我们先看段代码&#xff1a; #include "stdafx.h" #include <iostream>using namespace std; void func(void *p) {cout << "p is pointer " << p << endl; } void func(int num) {cout &l…

C/C++如何快速区分指针数组|数组指针|函数指针|指针函数

如何区分这些概念&#xff0c;主要还是看后面两个字&#xff0c;中文表达模式“​表语定性名词​”&#xff0c;​所以关键的都是后面的这个名词​&#xff1a; ​指针数组​&#xff1a;一个数组&#xff0c;数组元素是指针&#xff0c;如&#xff1a; int* p[20]; ​数组指…

Foxmail记事插入的表格怎么设置单元格边距

Foxmail在使用记事时候&#xff0c;插入了表格&#xff0c;该怎么设置单元格的边距呢?下面我们就来看看详细的教程。 Foxmail记事插入的表格怎么设置单元格边距? 1、下载并安装Foxmail邮件客户端。 Foxmail记事插入的表格怎么设置单元格边距? 2、打开Foxmail邮件客户端&…

C++11新特性探索:原始字符串字面值(raw string literal)

原始字符串字面值(raw string literal)是C11引入的新特性。 原始字符串简单来说&#xff0c;“原生的、不加处理的”&#xff0c;字符表示的就是自己&#xff08;所见即所得&#xff09;&#xff0c;引号、斜杠无需 “\” 转义&#xff0c;比如常用的目录表示&#xff0c;引入…

C++11新特性探究:显式override和final

C中&#xff0c;我们一般可以以基类声明纯虚函数&#xff0c;然后让派生类继承并重写这个虚函数&#xff0c;用​override表示显示覆盖基类方法&#xff0c;但一直没有提供一种方法来阻止派生类继承基类的虚函数。 C11标准引入了final说明符&#xff0c;很好的解决了上面的问题…

微信公众号小程序与服务号和订阅号有什么区别

微信中有小程序&#xff0c;有微信订阅号、微信服务号&#xff0c;这些功能之间有什么区别?下面我们就来详细介绍一下。 一、适合的场景 都是搭建在微信平台&#xff0c;功能、主要用途有些区别&#xff0c;使用不同的场景 微信公众号小程序与服务号和订阅号有什么区别? …

Android国标接入终端实现GB28181实时位置(MobilePosition)上报

技术背景 在实现本文提到的Android平台国标GB28181接入终端的实时位置上报之前&#xff0c;之前已经完成了Android终端GB28181常规功能接入&#xff0c;采集到实时音视频数据&#xff0c;编码PS打包后&#xff0c;按需传到GB28281服务平台&#xff0c;媒体流支持最新GB28181-2…

基于RTMP的智慧数字人|AI数字人传输技术方案探讨

技术背景 随着智慧数字人、AI数字人的兴起&#xff0c;越来越多的公司着手构建​全息、真实感数字角色等技术合成的数字仿真人虚拟形象&#xff0c;通过“虚拟形象语音交互&#xff08;T-T-S、ASR&#xff09;自然语言理解&#xff08;NLU&#xff09;深度学习”&#xff0c;构…

360手机助手游戏怎么实名认证 360手机助手下载的游戏怎么关了悬浮窗

360手机助手除了我们日常的传输文件&#xff0c;分享资源之外&#xff0c;上面还是有海量的游戏资源供我们下载的&#xff0c;而且平台还提供360币可以进行充值&#xff0c;不过很多小伙伴在下载游戏之后不知道在哪实名认证&#xff0c;哪里可以改实名认证?下面一起来看看。 …

​GB28181心跳机制探讨和技术实现

​GB/T 28181-2016心跳机制​ ​通过周期性的状态信息报送&#xff0c;实现注册服务器与源设备之间的状态检测即心跳机制。 ​ ​心跳发送方、接收方需统一配置“心跳间隔”参数&#xff0c;按照“心跳间隔”定时发送心跳消息&#xff0c;默认心跳间隔60s。心跳发送方、接收方…

Win7系统电脑怎么设置桌面壁纸全屏显示

我们在使用电脑的时候经常会进行一些个性化的设置。电脑桌面壁纸肯定是许多小伙伴最先更改的个性化设置之一。但是有许多小伙伴发现自己的win7电脑在更换壁纸的时候&#xff0c;图像显示过小&#xff0c;没有办法全屏显示&#xff0c;Win7系统电脑怎么设置桌面壁纸全屏显示?下…

Unity3D下Linux平台播放RTSP或RTMP流

背景 尽管Windows平台有诸多优势&#xff0c;Linux平台的发展还是势不可挡&#xff0c;特别实在传统行业&#xff0c;然而Linux生态构建&#xff0c;总是差点意思&#xff0c;特别是有些常用的组件&#xff0c;本文基于已有的Linux平台RTSP、RTMP播放模块&#xff0c;构建Unit…

std::jthread与std::thread区别

​std::jthread是C20新引入的线程类&#xff0c;与 std::thread 类似&#xff0c;或者说&#xff0c;jthread是对thread进一步的封装&#xff0c;功能更强大​。 ​std::jthread的​j实际上是​joining的缩写​&#xff0c;​众所周知&#xff0c;std::thread在其生命周期结束…