如何让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 (标记、标签)用来容纳和描述内容 严格意义上,标签是指开始标签…...
7.4.分块查找
一.分块查找的算法思想: 1.实例: 以上述图片的顺序表为例, 该顺序表的数据元素从整体来看是乱序的,但如果把这些数据元素分成一块一块的小区间, 第一个区间[0,1]索引上的数据元素都是小于等于10的, 第二…...
关于iview组件中使用 table , 绑定序号分页后序号从1开始的解决方案
问题描述:iview使用table 中type: "index",分页之后 ,索引还是从1开始,试过绑定后台返回数据的id, 这种方法可行,就是后台返回数据的每个页面id都不完全是按照从1开始的升序,因此百度了下,找到了…...
postgresql|数据库|只读用户的创建和删除(备忘)
CREATE USER read_only WITH PASSWORD 密码 -- 连接到xxx数据库 \c xxx -- 授予对xxx数据库的只读权限 GRANT CONNECT ON DATABASE xxx TO read_only; GRANT USAGE ON SCHEMA public TO read_only; GRANT SELECT ON ALL TABLES IN SCHEMA public TO read_only; GRANT EXECUTE O…...
生成 Git SSH 证书
🔑 1. 生成 SSH 密钥对 在终端(Windows 使用 Git Bash,Mac/Linux 使用 Terminal)执行命令: ssh-keygen -t rsa -b 4096 -C "your_emailexample.com" 参数说明: -t rsa&#x…...
深入解析C++中的extern关键字:跨文件共享变量与函数的终极指南
🚀 C extern 关键字深度解析:跨文件编程的终极指南 📅 更新时间:2025年6月5日 🏷️ 标签:C | extern关键字 | 多文件编程 | 链接与声明 | 现代C 文章目录 前言🔥一、extern 是什么?&…...
用docker来安装部署freeswitch记录
今天刚才测试一个callcenter的项目,所以尝试安装freeswitch 1、使用轩辕镜像 - 中国开发者首选的专业 Docker 镜像加速服务平台 编辑下面/etc/docker/daemon.json文件为 {"registry-mirrors": ["https://docker.xuanyuan.me"] }同时可以进入轩…...
如何在网页里填写 PDF 表格?
有时候,你可能希望用户能在你的网站上填写 PDF 表单。然而,这件事并不简单,因为 PDF 并不是一种原生的网页格式。虽然浏览器可以显示 PDF 文件,但原生并不支持编辑或填写它们。更糟的是,如果你想收集表单数据ÿ…...
关于easyexcel动态下拉选问题处理
前些日子突然碰到一个问题,说是客户的导入文件模版想支持部分导入内容的下拉选,于是我就找了easyexcel官网寻找解决方案,并没有找到合适的方案,没办法只能自己动手并分享出来,针对Java生成Excel下拉菜单时因选项过多导…...
实战三:开发网页端界面完成黑白视频转为彩色视频
一、需求描述 设计一个简单的视频上色应用,用户可以通过网页界面上传黑白视频,系统会自动将其转换为彩色视频。整个过程对用户来说非常简单直观,不需要了解技术细节。 效果图 二、实现思路 总体思路: 用户通过Gradio界面上…...
Docker拉取MySQL后数据库连接失败的解决方案
在使用Docker部署MySQL时,拉取并启动容器后,有时可能会遇到数据库连接失败的问题。这种问题可能由多种原因导致,包括配置错误、网络设置问题、权限问题等。本文将分析可能的原因,并提供解决方案。 一、确认MySQL容器的运行状态 …...
