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

2022-03-08 10:22:41 浏览数 (1)

​技术背景

在我们研发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前端接入。

信令接口设计:

代码语言:javascript复制
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();
}

相关状态回调:

代码语言:javascript复制
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平台。

0 人点赞