首页 > 其他分享 >如何让Android平台像网络摄像机一样实现GB28181前端设备接入?

如何让Android平台像网络摄像机一样实现GB28181前端设备接入?

时间:2023-09-10 11:55:39浏览次数:43  
标签:编码 GB28181 支持 摄像机 state 接口 Android type id

 

技术背景

好多开发者在做国标对接的时候,首先想到的是IPC(网络摄像头),通过参数化配置,接入到国标平台,实现媒体数据的按需查看等操作。

像执法记录仪等智能终端,跑在Android平台,对接GB28181平台的需求也非常大,网上相关demo也不少,但真正设计符合相关协议规范、功能完善、长时间稳定运行的并不多。基于此,华脉智联研发了Android平台GB28181接入模块,目前功能设计,总的来说,IPC有的功能要有,IPC缺失的,但是对业务诉求有要求的,也要有,比如MobilePosition实时位置上报,实时快照、本地录像、屏幕采集、拉取RTSP或RTMP对接到GB28181平台、实时动态水印、实时音量调节、外部编码前后对接等:

 

[视频格式]H.264/H.265(Android H.265硬编码);

[音频格式]G.711 A律、AAC;

[音量调节]Android平台采集端支持实时音量调节;

[H.264硬编码]支持H.264特定机型硬编码;

[H.265硬编码]支持H.265特定机型硬编码;

[软硬编码参数配置]支持gop间隔、帧率、bit-rate设置;

[软编码参数配置]支持软编码profile、软编码速度、可变码率设置;

支持横屏、竖屏推流;

Android平台支持后台service推送屏幕(推送屏幕需要5.0+版本);

支持纯视频、音视频PS打包传输;

支持RTP OVER UDP和RTP OVER TCP被动模式;

支持信令通道网络传输协议TCP/UDP设置;

支持注册、注销,支持注册刷新及注册有效期设置;

支持设备目录查询应答;

支持心跳机制,支持心跳间隔、心跳检测次数设置;

支持移动设备位置(MobilePosition)订阅和通知;

支持国标GB/T28181—2016平台接入;

支持语音广播及语音对讲;

[实时水印]支持动态文字水印、png水印;

[镜像]Android平台支持前置摄像头实时镜像功能;

[实时静音]支持实时静音/取消静音;

[实时快照]支持实时快照;

[降噪]支持环境音、手机干扰等引起的噪音降噪处理、自动增益、VAD检测;

[外部编码前视频数据对接]支持YUV数据对接;

[外部编码前音频数据对接]支持PCM对接;

[外部编码后视频数据对接]支持外部H.264数据对接;

[外部编码后音频数据对接]外部AAC数据对接;

[扩展录像功能]支持录像相关功能。

技术接口设计

接口设计这块,我们分三个部分:一个是供Publisher实例调用的接口,一个是RTP发送相关的接口,还有一个是针对语音广播这块,实现的接收RTP数据播放接口。

先说供GB28181推送实例调用的接口:

/*+++++++++++++++GB28181相关接口+++++++++++++++*/
private native long nativeCreate(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, String sdk_version);



private native void nativeRegister(final long ptr);
private native void nativeUnRegister(final long ptr);
/*+++++++++++++++GB28181相关接口+++++++++++++++*/

  

再说RTP发送相关的接口:

/*+++++++++++++++RTP Sender相关接口+++++++++++++++*/
public native void nativePushEncodedAudio(long handle,
int devId, byte[] data, int length);
public native void nativePushEncodedVideo(long handle,
int devId, byte[] data, int length);

/*+++++++++++++++RTP Sender相关接口+++++++++++++++*/

  

接收相关的接口

void sip_audio_decode_cb(AVFrame * frame, void *
userdata)
{
log_print(HT_LOG_INFO,"PTT- %s start
sip_audio_decode_cb",__FUNCTION__ );
 SUA * p_sua =
(SUA *) userdata;
 if (NULL ==
p_sua->media_info.audio_player)
 {
log_print(HT_LOG_INFO,"PTT- %s, p_sua->media_info.audio_player
is null###",__FUNCTION__ );
#ifdef ANDROID_AS
p_sua->media_info.dataQueue = new DataQueue();
p_sua->media_info.audio_player = new
OpenSlEsPlayer(p_sua->media_info.dataQueue, 8000);
p_sua->media_info.audio_player->play();
#endif
 }
 if
(p_sua->media_info.audio_player)
 {
 PcmData
*pdata = new PcmData((char *) frame->data[0], frame->nb_samples *
frame->channels * av_get_bytes_per_sample((enum
AVSampleFormat)frame->format));
p_sua->media_info.dataQueue->putPcmData(pdata);
 }
}

  

上述接口说过之后,大家可能疑惑,信令交互呢?信令交互,我们是在Android上层实现。

如基础参数配置:

GBParam(
 ip =
"222.185.255.66",
 port = 5060,
 server_id =
"34020000002000000001",
 server_domain =
"3402000000",
 device_id =
"34020000001320000609",
 device_pwd =
"123456",
 device_name =
"GB28181 Device",
 tcpudp = 0,
heartbeat_interval = 30,
 reg_expire =
3600
)

  

信令交互处理:

private val engineEventHandler =
IEngineEventHandler { type, state ->
 if (type ==
EventHandlerStatus.EventHandlerType.type_register) {
 when
(state) {
EventHandlerStatus.RegisterState.unregister -> { //反注册
logI("onState: id=${type.toCallTypeString()},
state=unregister($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 -> { //视频监控挂断
 }
 }
 }
 }

  

除了基础的Camera接口外,5.0开始新的Camera2数据依旧可以正常对接,感兴趣的开发者可酌情参考。

标签:编码,GB28181,支持,摄像机,state,接口,Android,type,id
From: https://www.cnblogs.com/pttlink/p/17690968.html

相关文章

  • Android前端音视频数据接入GB28181平台意义
    技术背景在我们研发Android平台GB28181前端音视频接入模块之前,业内听到最多的是,如何用Android端在没有国标摄像头设备的前提下,模拟GB28181的信令和媒体流交互流程,实现GB28181整体方案的测试。 Android端真的没有必要做个支持GB28181的接入模块? 如果说做一个设备端摄像头国......
  • 华脉智联发布国标28181 Android SDK和DEMO
    在目前很多行业项目中,客户使用的是海康、大华等监控平台的GB/28181平台,或者是其他的第三方的GB/28181平台。但是对于那些不具备GB/28181协议的单兵终端,如何接入GB/28181平台网络中呢?首先,我们了解下GB/T28181:国标GB/T28181协议全称《安全防范视频监控联网系统信息传输、交换、控制技......
  • Android前端音视频数据接入GB28181平台意义
    技术背景在我们研发Android平台GB28181前端音视频接入模块之前,业内听到最多的是,如何用Android端在没有国标摄像头设备的前提下,模拟GB28181的信令和媒体流交互流程,实现GB28181整体方案的测试。Android端真的没有必要做个支持GB28181的接入模块?如果说做一个设备端摄像头国标设备接入......
  • 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 还要重启电脑!!!!!!解决。 ......