首页 > 其他分享 >Android前端音视频数据接入GB28181平台意义

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

时间:2023-09-10 11:00:50浏览次数:53  
标签:String GB28181 param server device Android 音视频 id

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

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

如果说做一个设备端摄像头国标设备接入模拟模块是完成从0到1的工作,那么从设备端模拟摄像头到一个可以产品化的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前端接入。

信令接口设计:

 /**
 * init gb28181
 *
 * @param server_ip          server ip
 * @param port               server port
 * @param server_id          server id
 * @param server_domain      server domain
 * @param device_id          device id
 * @param device_pwd         password
 * @param device_name        device name
 * @param tcpudp             0 - udp; 1 - tcp
 * @param heartbeat_interval gb28181 heartbeat interval, unit is second
 * @param reg_expire         sip reg user expires, unit is second
 * @return
 */
public boolean init(String server_ip, int port, String server_id, String server_domain, String device_id,
                    String device_pwd, String device_name,
                    int tcpudp, int heartbeat_interval, int reg_expire) {
}


/**
 * init gb28181
 *
 * @param server_ip          server ip
 * @param port               server port
 * @param server_id          server id
 * @param server_domain      server domain
 * @param device_id          device id
 * @param device_pwd         password
 * @param device_name        device name
 * @param tcpudp             0 - udp; 1 - tcp
 * @param heartbeat_interval gb28181 heartbeat interval, unit is second
 * @param reg_expire         sip reg user expires, unit is second
 * @return
 */
public boolean init(String server_ip, int port, String server_id, String server_domain, String device_id,
                    String device_pwd, String device_name,
                    int tcpudp, int heartbeat_interval, int reg_expire) {


/**
 * update gb28181 config
 *
 * @param server_ip          server ip
 * @param port               server port
 * @param server_id          server id
 * @param server_domain      server domain
 * @param device_id          device id
 * @param device_pwd         password
 * @param device_name        device name
 * @param tcpudp             0 - udp; 1 - tcp
 * @param heartbeat_interval gb28181 heartbeat interval, unit is second
 * @param reg_expire         sip reg user expires, unit is second
 * @return
 */
public void updateConfig(String server_ip, int port, String server_id, String server_domain, String device_id,
                         String device_pwd, String device_name,
                         int tcpudp, int heartbeat_interval, int reg_expire) {
 }


相关状态回调: gbEngine.addEventHandler(handler: IEngineEventHandler)

// 国标底层事件回调 private val engineEventHandler = IEngineEventHandler { type, state -> if (type == EventHandlerStatus.EventHandlerType.type_register) { when (state) { EventHandlerStatus.RegisterState.unregister -> { //反注册 logI("onState: id=Android前端音视频数据接入GB28181平台意义_信令state)") }

EventHandlerStatus.RegisterState.register_fail -> { //注册失败
                logI("onState: id=${type.toCallTypeString()}, state=register_fail($state)")
            }

            EventHandlerStatus.RegisterState.register_success -> { //注册成功
                logI("onState: id=${type.toCallTypeString()}, state=register_success($state)")
            }

            EventHandlerStatus.RegisterState.register_forbidden -> { //注册失败,udp/tcp协议不对、密码不对等注册参数不对
                logI("onState: id=${type.toCallTypeString()}, state=register_forbidden($state)")
            }

            else -> {
                logI("onState: id=${type.toCallTypeString()}, state=PUEVT_REG_PASS($state)")
            }
        }
    } else {
        logI("onState: id=${type.toCallTypeString()}, state=${state.toEventString()}")
    }

    if (type == EventHandlerStatus.EventHandlerType.type_call_in) { //呼入事件
        when (state) {
            EventHandlerStatus.EventState.PUEVT_CALL_IN -> { //视频监控呼入
            }

            EventHandlerStatus.EventState.PUEVT_CONNECT -> { //视频监控接通

            }

            EventHandlerStatus.EventState.PUEVT_HANGUP -> { //视频监控挂断
            }
        }
    }
}

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

标签:String,GB28181,param,server,device,Android,音视频,id
From: https://blog.51cto.com/u_16239556/7423991

相关文章

  • Android中使用GSON解析JSON数据
    Android中使用GSON解析JSON数据,以下为java代码。我这个是Unity项目打包出来的android工程,工程里自带有gson的库,所以能直接用了。publicvoidStringToJsonByGson(Stringjson){Gsongs=newGson();Model1model=gs.fromJson(json,Model1.class......
  • 掌握这些面试题和技巧,Android程序员轻松提高拿到offer的概率
    前言在竞争激烈的IT行业,程序员面试成为了每个开发者必须经历的一道关卡。无论是应聘初级岗位还是高级职位,面试都扮演着决定命运的重要角色。然而,对于很多程序员来说,面试过程充满了不确定性和挑战。下面将在面试中,总结出来的一些建议和策略分享给大家。一、了解面试流程与目标:在准备......
  • 作为Android程序员,为什么我的简历能让HR一眼就约面谈?
    前言我看过很多的简历,很多程序员其实是很懒的,尤其是工作了三、四年的程序员,很多人的简历才只有一页,只是把自已工作过的公司以及做的项目简单罗列一下,这是不对的,这是自已的不负责任。因为这样的简历很有可能让HR直接筛掉,因为HR每天面对几百上千份简历,一般都是通过关键词搜索来做初筛......
  • 5000字超详细字节跳动Android客户端面经
    现在,秋招马上来临,在牛客网上看了不少帖子,不少同学对大厂的面试有所忌惮,总担心准备不够。我之前面试了好几家公司,这里总结一下自己的面经和复习历程,顺便谈谈我的一些感受,给各位朋友提供一些参考,也不要对大厂面试有抵触情绪。我对字节跳动的一些看法周围有很多人也都在用字节的拳头产......
  • 三年Android开发,月薪一万二,不敢跳槽,每天都很焦虑
    在我们的身边,存在一个普遍现象:很多人从事Android开发工作多年,走过的弯和坎,不计其数,经历的心酸难与外人道也。可是技术确难以提升、止步不前,薪资也只能看着别人水涨船高,自己却没有什么起色。虽然在公司里属于不可缺少的一员,但是同时又担心离开了这家公司就找不到更好的工作了。有这......
  • Android虚拟机原理面试题汇总(含详细解析 一)
    Android并发编程高级面试题汇总最全最细面试题讲解持续更新中......
  • but Android SDK not found at this location.
    ENVPATH里设置好, SDKMANAGER路径要保持一致。这个是常规操作。还有个隐藏操作: SDKMANGERTOOLS里,点取消 hideobse.... 然后安装 AndroidSDKtools 添加path:sdk里的 D:\android_sdk\tools  D:\android_sdk\platform-tools 还要重启电脑!!!!!!解决。 ......
  • 基于live555开源流媒体服务器开发的EasyRTSPServer实现自定义数据与音视频数据的同步
    基于live555开源流媒体服务器开发的EasyRTSPServer实现的是视频和音频的数据传输,而随着智能分析的应用越来越多,如何将分析结果传给客户端也势在必行了。分析问题EasyRTSPServer基于live555改造而来,通过分析代码可以知道,其实它已经自带了metadata的传输.我们要做的就是怎样将这个me......
  • 【Android 开发】金九银十斩获offer秘籍:简历优化+Android大厂面试真题
    前言面试是一场没有硝烟的战争,这句话看有点危言耸听,但是在面试中考验的确无处不在。金九银十已经开始一个星期了,在面试或准备面试的小伙伴如果你在面试中对面试官所问的问题感到有困难时,那说明是我们的基础功没打好,或者是对面试题了解的还不够多。如果是连面试邀约都没有的小伙伴,咱......
  • 2023金九银十Android高级工程师面试 1000 题+答案(全)
    前言面对金九银十的招聘旺季,如果没有精心准备那笔者认为那是对自己不负责任;就我们Android程序员来说,多数的公司总体上面试都是以自我介绍+项目介绍+项目细节/难点提问+基础知识点考核+算法题这个流程下来的。有些公司可能还会问几个实际的场景类的问题,这个环节阿里是必问的,这种问......