当前位置: 首页 > news >正文

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

图片

技术背景

好多开发者在做国标对接的时候,首先想到的是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, intport, String server_id, Stringserver_domain, String device_id, String device_pwd, Stringdevice_name, int tcpudp, int heartbeat_interval, intreg_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 startsip_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_playeris null###",__FUNCTION__ );#ifdef ANDROID_ASp_sua->media_info.dataQueue = new DataQueue();p_sua->media_info.audio_player = newOpenSlEsPlayer(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((enumAVSampleFormat)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数据依旧可以正常对接,感兴趣的开发者可酌情参考。

图片

http://www.lryc.cn/news/154615.html

相关文章:

  • 文盘Rust -- 生命周期问题引发的 static hashmap 锁 | 京东云技术团队
  • SpringMVC入门篇
  • 面经:安卓学习笔记
  • Java设计模式:四、行为型模式-06:观察者模式
  • vscode中讨厌的蓝色波浪线的去除小trick和原理
  • 开发工具——IDE安装 / IDEA子module依赖导入失败编译提示xx找不到符号 / IDEA在Git提交时卡顿
  • AcWing 787:归并排序
  • SeamlessM4T—Massively Multilingual Multimodal Machine Translation
  • Python数据分析-Numpy
  • 【真题解析】系统集成项目管理工程师 2023 年上半年真题卷(案例分析)
  • 【GAMES202】Real-Time Global Illumination(in 3D)—实时全局光照(3D空间)
  • 金蝶云星空二开,公有云执行SQL
  • JAVA String 二维的字符串数组 String[][]
  • 【Unity3D赛车游戏优化篇】【九】Unity中如何让汽车丝滑漂移?
  • el-dialog设置高度、使用resetFields清除表单项无效问题
  • MySql切换到达梦数据库,各种问题解决记录
  • 2023开学礼山东财经大学《乡村振兴战略下传统村落文化旅游设计》许少辉新财经图书馆
  • vscode中使用eslint+prettier的配置
  • HTML 标签讲解
  • ue5 小知识点 ue的world type,pie editor game
  • 两表union 如何保证group by 字段唯一
  • 【⑰MySQL】 变量 | 循环 | 游标 | 处理程序
  • 如何在arXiv上发表一篇文章
  • 重要性采样
  • 说说Omega架构
  • 高忆管理:光刻胶概念强势拉升,同益股份、格林达涨停
  • 计算机图形学线性代数相关概念
  • 开源PHP 代挂机源码,可对接QQ、网易云、哔哩哔哩、QQ空间、等级加速等等
  • 【仿牛客论坛java项目】第五章 Kafka,构建TB级异步消息系统:阻塞队列、Kafka入门、Spring整合Kafka、发送系统通知、显示系统通知
  • 【AIGC专题】Stable Diffusion 从入门到企业级实战0401