如何让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数据依旧可以正常对接,感兴趣的开发者可酌情参考。

相关文章:
如何让Android平台像网络摄像机一样实现GB28181前端设备接入?
技术背景 好多开发者在做国标对接的时候,首先想到的是IPC(网络摄像头),通过参数化配置,接入到国标平台,实现媒体数据的按需查看等操作。 像执法记录仪等智能终端,跑在Android平台,…...
文盘Rust -- 生命周期问题引发的 static hashmap 锁 | 京东云技术团队
2021年上半年,撸了个rust cli开发的框架,基本上把交互模式,子命令提示这些cli该有的常用功能做进去了。项目地址:https://github.com/jiashiwen/interactcli-rs。 春节以前看到axum已经0.4.x了,于是想看看能不能用rus…...
SpringMVC入门篇
目录 1.SpringMVC工作流程 2.SpringMVC核心组件 2.1 DispatcherServlet 2.2 HandlerMapping 2.3 Handler 2.4 HandlerAdapter 2.5 ViewResolver 2.6 View 3.SpringMVC的入门 3.1 添加相关依赖 3.2 创建Spring-mvc.xml 3.3 配置web.xml 3.4 效果演示 4.静态资源处…...
面经:安卓学习笔记
文章目录 1. Android系统架构2. Activity2.0 定义2.1 生命周期2.2 生命状态2.3 启动模式 3. Service3.1 定义3.2 两种启动方式3.3 生命周期3.4 跨进程service3.5 IntentService 4. BroadCastReceiver4.1 概念4.2 组成4.3 广播接收器的分类4.4 生命周期4.5 静态注册和动态注册 5…...
Java设计模式:四、行为型模式-06:观察者模式
文章目录 一、定义:观察者模式二、模拟场景:观察者模式2.1 观察者模式2.2 引入依赖2.3 工程结构2.4 模拟摇号2.4.1 摇号服务接口2.4.2 摇号返回结果类 三、违背方案:观察者模式3.0 引入依赖3.1 工程结构3.2 添加摇号接口和实现3.2.1 摇号服务…...
vscode中讨厌的蓝色波浪线的去除小trick和原理
问题描述 不小心“设置同步”时和远程电脑的合并(merge)了,然后就出现了这个问题!烦死了!!! 大概是这个样子: 解决办法 站在了巨人的肩膀上,在下图位置输入这样一行参数&…...
开发工具——IDE安装 / IDEA子module依赖导入失败编译提示xx找不到符号 / IDEA在Git提交时卡顿
近期换了工作电脑,公司的IT团队不够给力,不能复制电脑系统,所以又到了需要重装IDE配置开发环境的时候了;在安装和导入Java编译器IDEA的时候遇到一些"棘手"问题,这里整理下解决方法以备不时之需; …...
AcWing 787:归并排序
【题目来源】https://www.acwing.com/problem/content/789/【题目描述】 给定你一个长度为 n 的整数数列。 请你使用归并排序对这个数列按照从小到大进行排序。 并将排好序的数列按顺序输出。【输入格式】 输入共两行,第一行包含整数 n。 第二行包含 n 个整数&#…...
SeamlessM4T—Massively Multilingual Multimodal Machine Translation
本文是LLM系列的文章,针对《SeamlessM4T—Massively Multilingual & Multimodal Machine Translation》的翻译。 SeamlessM4T:大规模语言多模态机器翻译 摘要1 引言2 多模态翻译的社会技术维度2.12.22.3 3 SeamlessAlign:自动创建语音对…...
Python数据分析-Numpy
Numpy 个人笔记,仅供参考,谢谢 导入 import numpy import numpy as np from numpy import *Numpy数组对象 引入 # 让列表1 a [1,2,3,4],b [4,5,6,7] [x1 for x in a] # 实现ab a b > [1,2,3,4,5,6,7,8] [x y for (x,y) in zip(a,b)] -------…...
【真题解析】系统集成项目管理工程师 2023 年上半年真题卷(案例分析)
本文为系统集成项目管理工程师考试(软考) 2023 年上半年真题(全国卷),包含答案与详细解析。考试共分为两科,成绩均 ≥45 即可通过考试: 综合知识(选择题 75 道,75分)案例分析(问答题 4 道,75分)案例分析(问答题*4)试题一试题二试题三试题四案例分析(问答题*4) …...
【GAMES202】Real-Time Global Illumination(in 3D)—实时全局光照(3D空间)
一、SH for Glossy transport 1.Diffuse PRT回顾 上篇我们介绍了PRT,并以Diffuse的BRDF作为例子分析了预计算的部分,包括Lighting和Light transport,如上图所示。 包括我们还提到了SH,可以用SH的有限阶近似拟合球面函数ÿ…...
金蝶云星空二开,公有云执行SQL
功能背景; 金蝶公有云执行sql工具,因官方为云部署 用户无法连接数据库增删改查 天梯维护网页仅支持增删改操作 二开单据已支持根据sql动态生成单据体 与sql可视化界面操作一致 功能实现及场景: 1.可用于公有云执行sql类操作 2.私有云部署&am…...
JAVA String 二维的字符串数组 String[][]
String[][] 表示一个二维的字符串数组,也可以称为字符串矩阵。它是由多个一维的字符串数组组成的,每个一维数组都表示矩阵中的一行。 在 Java 中,可以使用如下方式声明和初始化一个二维字符串数组: String[][] matrix new Strin…...
【Unity3D赛车游戏优化篇】【九】Unity中如何让汽车丝滑漂移?
👨💻个人主页:元宇宙-秩沅 👨💻 hallo 欢迎 点赞👍 收藏⭐ 留言📝 加关注✅! 👨💻 本文由 秩沅 原创 👨💻 收录于专栏:Uni…...
el-dialog设置高度、使用resetFields清除表单项无效问题
初学者容易踩坑的的el-dialog、el-form问题 1. el-dialog设置高度2. el-form中表单项对不齐3. 使用resetFields清除表单项无效 1. el-dialog设置高度 在el-dialog中里面添加一个div设置固定高度,或者限制最小的高度。 <el-dialogtitle"选择图标"v-mod…...
MySql切换到达梦数据库,各种问题解决记录
参考官方文档: https://eco.dameng.com/document/dm/zh-cn/sql-dev/practice-func.html 1. 关键字导致的报错:如ref,comment,top,domain等 Error -2007: 第 1 行, 第 117 列[ref]附近出现错误: 语法分析出错解决方案:修改关键字即可 2. 查…...
2023开学礼山东财经大学《乡村振兴战略下传统村落文化旅游设计》许少辉新财经图书馆
2023开学礼山东财经大学《乡村振兴战略下传统村落文化旅游设计》许少辉新财经图书馆...
vscode中使用eslint+prettier的配置
eslintprettiervscode自动保存用起来感觉非常爽快。 一般来说,安装eslintprettier插件,然后使用相关脚手架配套的eslintprettier,无法自动格式代码,每次都需要执行格式化命令。这里贴出保存自动格式化代码的setting.json。 // .…...
HTML 标签讲解
HTML 标签讲解 HTML 语言结构根元素元数据元素主体根元素大纲元素文本内容语义化内联文本图像与多媒体编辑标识table表格内容表单内容table表单 HTML 语言结构 Markup (标记、标签)用来容纳和描述内容 严格意义上,标签是指开始标签…...
SEO 舆情处理中数据分析的作用是什么
SEO 舆情处理中数据分析的作用 在当今数字化社会,搜索引擎优化(SEO)和舆情处理已经成为企业品牌管理的重要组成部分。尤其是在网络信息迅速传播的今天,舆情的好坏直接影响到企业的声誉和市场竞争力。因此,如何有效地进…...
主流信道模型对比:从COST207到WINNER II的多场景性能解析
1. 信道模型的前世今生:为什么我们需要这么多标准? 第一次接触信道模型时,我也被各种COST、WINNER之类的缩写搞晕了。这就像去超市买酱油,发现货架上摆着生抽、老抽、海鲜酱油、薄盐酱油...其实它们都是为了解决不同场景下的调味需…...
K3s证书过期急救指南:5分钟搞定证书轮换(附一键脚本)
K3s证书过期急救指南:5分钟搞定证书轮换(附一键脚本) 凌晨三点,报警短信突然炸响——K3s集群所有服务不可用。登录控制台看到满屏的x509: certificate has expired or is not yet valid报错时,我才意识到证书过期这个&…...
bun执行nodejs
使用 Bun 执行 Node.js 代码非常简单,因为 Bun 设计为与 Node.js 高度兼容。以下是完整的使用指南:1. 安装 Bunbash复制# macOS / Linux curl -fsSL https://bun.sh/install | bash# Windows (通过 WSL) curl -fsSL https://bun.sh/install | bash# 或通…...
别再只会用OpenCV了!用GStreamer在树莓派上搭建一个低延迟的CSI摄像头监控系统(附Python代码)
树莓派CSI摄像头低延迟方案:GStreamer实战指南 在嵌入式视觉项目中,树莓派搭配CSI摄像头是经典组合,但许多开发者发现OpenCV的VideoCapture接口在实时性上表现不佳——高延迟、CPU占用率飙升、帧率不稳定等问题频发。我曾在一个智能门铃项目中…...
2007 Text 3
2007 Text 3...
别再问怎么连了!Win10蓝牙串口配对仪器设备,保姆级图文教程(含端口号查看)
Win10蓝牙串口连接实战指南:从配对到调试的全流程解析 蓝牙串口通信在嵌入式开发中扮演着关键角色,特别是在需要无线传输数据的场景下。想象一下,当你面对一台工业测量设备,需要通过蓝牙实时获取数据流,却发现Windows …...
2025届学术党必备的六大AI科研网站推荐榜单
Ai论文网站排名(开题报告、文献综述、降aigc率、降重综合对比) TOP1. 千笔AI TOP2. aipasspaper TOP3. 清北论文 TOP4. 豆包 TOP5. kimi TOP6. deepseek 为能切实有效地把文本的AIGC检测概率给降低下来,得从业经历连贯性以及统计规律这…...
2026届必备的降AI率神器推荐
Ai论文网站排名(开题报告、文献综述、降aigc率、降重综合对比) TOP1. 千笔AI TOP2. aipasspaper TOP3. 清北论文 TOP4. 豆包 TOP5. kimi TOP6. deepseek 若想切实有效地降低文本所具有的AIGC(人工智能生成内容)特征…...
Keil5避坑大全:如何解决中文路径、红叉问题和动态语法检查的误区
Keil5开发实战:彻底解决中文路径、红叉与语法检查三大难题 在嵌入式开发领域,Keil MDK作为ARM处理器的主流开发环境,其稳定性和专业性备受开发者信赖。但即使是这样一个成熟的工具链,在实际使用中仍会遇到几个高频痛点:…...
