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

本文涉及的产品
容器服务 Serverless 版 ACK Serverless,317元额度 多规格
容器服务 Serverless 版 ACK Serverless,952元额度 多规格
简介: 在我们研发Android平台GB28181前端音视频接入模块之前,业内听到最多的是,如何用Android或者Windows端,在没有国标IPC设备的前提下,模拟GB28181的信令和媒体流交互流程,实现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。

4550bb3d026f84d9856d85a1ae126b50.jpg

如上图所示,模块除了常规的音视频参数配置外,系统可同时亦或单独实现如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平台。

相关实践学习
通过Ingress进行灰度发布
本场景您将运行一个简单的应用,部署一个新的应用用于新的发布,并通过Ingress能力实现灰度发布。
容器应用与集群管理
欢迎来到《容器应用与集群管理》课程,本课程是“云原生容器Clouder认证“系列中的第二阶段。课程将向您介绍与容器集群相关的概念和技术,这些概念和技术可以帮助您了解阿里云容器服务ACK/ACK Serverless的使用。同时,本课程也会向您介绍可以采取的工具、方法和可操作步骤,以帮助您了解如何基于容器服务ACK Serverless构建和管理企业级应用。 学习完本课程后,您将能够: 掌握容器集群、容器编排的基本概念 掌握Kubernetes的基础概念及核心思想 掌握阿里云容器服务ACK/ACK Serverless概念及使用方法 基于容器服务ACK Serverless搭建和管理企业级网站应用
相关文章
|
5天前
|
编解码 开发工具 Android开发
Android平台RTMP直播推送模块技术接入说明
大牛直播SDK跨平台RTMP直播推送模块,始于2015年,支持Windows、Linux(x64_64架构|aarch64)、Android、iOS平台,支持采集推送摄像头、屏幕、麦克风、扬声器、编码前、编码后数据对接,功能强大,性能优异,配合大牛直播SDK的SmartPlayer播放器,轻松实现毫秒级的延迟体验,满足大多数行业的使用场景。RTMP直播推送模块数据源,支持编码前、编码后数据对接
|
6天前
|
编解码 网络协议 开发工具
Android平台RTSP|RTMP直播播放器技术接入说明
大牛直播SDK自2015年发布RTSP、RTMP直播播放模块,迭代从未停止,SmartPlayer功能强大、性能强劲、高稳定、超低延迟、超低资源占用。无需赘述,全自研内核,行业内一致认可的跨平台RTSP、RTMP直播播放器。本文以Android平台为例,介绍下如何集成RTSP、RTMP播放模块。
|
5天前
|
开发工具 Android开发 开发者
Android平台如何不推RTMP|不发布RTSP流|不实时录像|不回传GB28181数据时实时快照?
本文介绍了一种在Android平台上实现实时截图快照的方法,尤其适用于无需依赖系统接口的情况,如在RTMP推送、RTSP服务或GB28181设备接入等场景下进行截图。通过底层模块(libSmartPublisher.so)实现了截图功能,封装了`SnapShotImpl.java`类来管理截图流程。此外,提供了关键代码片段展示初始化SDK实例、执行截图、以及在Activity销毁时释放资源的过程。此方案还考虑到了快照数据的灵活处理需求,符合GB/T28181-2022的技术规范。对于寻求更灵活快照机制的开发者来说,这是一个值得参考的设计思路。
|
6天前
|
前端开发 JavaScript
这篇文章介绍了如何使用form表单结合Bootstrap格式将前端数据通过action属性提交到后端的servlet,包括前端表单的创建、数据的一级和二级验证,以及后端servlet的注解和参数获取。
这篇文章介绍了使用AJAX技术将前端页面中表单接收的多个参数快速便捷地传输到后端servlet的方法,并通过示例代码展示了前端JavaScript中的AJAX调用和后端servlet的接收处理。
这篇文章介绍了如何使用form表单结合Bootstrap格式将前端数据通过action属性提交到后端的servlet,包括前端表单的创建、数据的一级和二级验证,以及后端servlet的注解和参数获取。
|
6天前
|
前端开发
第一种方式:使用form表单将前端数据提交到servelt(将前端数据提交到servlet)
这篇文章介绍了如何使用form表单结合Bootstrap格式将前端数据通过action属性提交到后端的servlet,包括前端表单的创建、数据的一级和二级验证,以及后端servlet的注解和参数获取。
第一种方式:使用form表单将前端数据提交到servelt(将前端数据提交到servlet)
|
6天前
|
存储 编解码 网络协议
Android平台GB28181执法记录仪硬件选型和国标技术实现探讨
前几年,我们在做Android平台GB28181设备接入模块的时候,第一个使用场景想到的就是用在公检法应急指挥等场景下的执法记录仪,本篇blog,我们主要围绕Android平台GB28181执法记录仪的硬件选型、设备接入、音视频流配置、流媒体传输、存储和管理、控制与控制中心等方面进行设计,探讨下Android平台GB28181设备接入模块在执法记录仪行业的应用。
Android平台GB28181执法记录仪硬件选型和国标技术实现探讨
|
6天前
|
Java Android开发 iOS开发
探索安卓与iOS开发的差异:平台选择对项目成功的影响
在移动应用开发的世界中,选择正确的平台是关键。本文通过比较安卓和iOS开发的核心差异,揭示平台选择如何影响应用的性能、用户体验和市场覆盖。我们将深入探讨各自的开发环境、编程语言、用户界面设计原则以及发布流程,以帮助开发者和企业做出明智的决策。
27 9
|
1天前
|
JSON Java Android开发
Android 开发者必备秘籍:轻松攻克 JSON 格式数据解析难题,让你的应用更出色!
【8月更文挑战第18天】在Android开发中,解析JSON数据至关重要。JSON以其简洁和易读成为首选的数据交换格式。开发者可通过多种途径解析JSON,如使用内置的`JSONObject`和`JSONArray`类直接操作数据,或借助Google提供的Gson库将JSON自动映射为Java对象。无论哪种方法,正确解析JSON都是实现高效应用的关键,能帮助开发者处理网络请求返回的数据,并将其展示给用户,从而提升应用的功能性和用户体验。
|
6天前
|
Java 开发工具 Android开发
安卓与iOS开发环境对比:选择合适的平台
【8月更文挑战第14天】在移动应用开发的广阔天地中,安卓和iOS是两座巍峨的山峰,各自拥有独特的生态环境和开发文化。本文旨在深入探讨这两大平台的开发环境,揭示它们在编程语言、工具支持、社区生态以及市场趋势方面的差异与联系。我们将穿梭于代码之外,以宏观的视角审视开发者面临的选择,并提供实用的建议,帮助那些站在十字路口的开发者们做出明智的决策。文章不仅着眼于技术层面的比较,还将触及两个平台如何塑造开发者的思维模式和职业生涯。
|
6天前
|
监控 开发工具 Android开发
Android平台实现RTSP拉流转发至轻量级RTSP服务
为满足Android平台上从外部RTSP摄像头拉流并提供轻量级RTSP服务的需求,利用大牛直播SDK实现了相关功能。SDK支持开始与停止拉流、音频视频数据回调处理及RTSP服务的启动与发布等操作。拉流仅需将未解码数据回调,对性能影响小。音频和视频数据经由特定接口传递给发布端进行处理。此外,SDK还提供了获取RTSP会话数量的功能。此方案适用于监控和巡检等低延迟应用场景,并支持二次水印添加等功能。