Android终端GB28181音视频实时回传设计探讨

技术背景

好多开发者,在调研Android平台GB28181实时回传的时候,对这块整体的流程,没有个整体的了解,本文以大牛直播SDK的SmartGBD设计开发为例,聊下如何在Android终端实现GB28181音视频数据实时回传。

技术实现

Android终端除支持常规的音视频数据接入外,还可以支持移动设备位置(MobilePosition)订阅和通知、语音广播和语音对讲、云台控制回调和预置位查询,可以考虑支持对接数据类型如下:

  • 编码前数据(目前支持的有YV12/NV21/NV12/I420/RGB24/RGBA32/RGB565等数据类型);
  • 编码后数据(如无人机等264/HEVC数据,或者本地解析的MP4音视频数据);
  • 拉取RTSP或RTMP流并接入至GB28181平台(比如其他IPC的RTSP流,可通过Android平台GB28181接入到国标平台)。

如果要做个技术通用且功能齐全的Android平台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、软编码速度、可变码率设置;
  • 支持纯视频、音视频PS打包传输;
  • 支持RTP OVER UDP和RTP OVER TCP被动模式;
  • 支持信令通道网络传输协议TCP/UDP设置;
  • 支持注册、注销,支持注册刷新及注册有效期设置;
  • 支持设备目录查询应答;
  • 支持心跳机制,支持心跳间隔、心跳检测次数设置;
  • 支持移动设备位置(MobilePosition)订阅和通知;
  •  适用国家标准:GB/T 28181—2016;
  • 支持语音广播;
  • 支持语音对讲;
  • 支持图像抓拍;
  • 支持历史视音频文件检索;
  • 支持历史视音频文件下载;
  • 支持历史视音频文件回放;
  • 支持云台控制和预置位查询;
  •  [实时水印]支持动态文字水印、png水印;
  •  [镜像]Android平台支持前置摄像头实时镜像功能;
  •  [实时静音]支持实时静音/取消静音;
  •  [实时快照]支持实时快照;
  •  [降噪]支持环境音、手机干扰等引起的噪音降噪处理、自动增益、VAD检测;
  •  [外部编码前视频数据对接]支持YUV数据对接;
  •  [外部编码前音频数据对接]支持PCM对接;
  •  [外部编码后视频数据对接]支持外部H.264数据对接;
  •  [外部编码后音频数据对接]外部AAC数据对接;
  •  [扩展录像功能]支持和录像SDK组合使用,录像相关功能。​

系统要求:

  • SDK支持Android 5.1及以上版本;
  • 支持的CPU架构:armv7, arm64, x86, x86_64。

前期准备

  • 满足系统要求:确保 Android 设备的系统版本为 5.1 及以上,以支持相关的功能和库。
  • 添加权限:在 AndroidManifest.xml 文件中添加必要的权限,如网络访问权限<uses-permission android:name="android.permission.internet"></uses-permission>、存储权限<uses-permission android:name="android.permission.write_external_storage"></uses-permission>等,这些权限是实现数据传输和存储所必需的。
  • 引入库文件:将相关的库文件添加到项目中,例如 smartavengine.jar 和 smartgbsipagent.jar 等。同时,将对应的 .so 文件(如 libsmartpublisher.so 和 libsmartplayer.so,如果需要语音广播或语音对讲功能)拷贝到项目中。
  • 配置构建文件:在 build.gradle 文件中进行相关配置,比如配置 32 位和 64 位库的支持,以确保应用能够在不同架构的 Android 设备上运行。

信令交互

  • 注册与登录:设备需要向 GB28181 平台进行注册,发送注册请求并等待平台的响应。注册信息包括设备的唯一标识、IP 地址、端口号等。在 Android 中,通过调用相关的 GB28181 库函数来实现注册功能。例如,设置服务器参数gb28181_agent_.setServerParameter(gb28181_sip_server_addr_, gb28181_sip_server_port_, gb28181_sip_server_id_, gb28181_sip_domain_),其中包括服务器地址、端口、服务器 ID 和域等信息。
  • 心跳机制:为了保持与平台的连接,设备需要定期向平台发送心跳消息,以告知平台设备仍然在线。设置心跳间隔和心跳检测次数等参数,例如 gb28181_agent_.config(gb28181_reg_expired_, gb28181_heartbeat_interval_, gb28181_heartbeat_count_)
  • 事件处理:实现对平台发送的各种信令的处理,如订阅、查询等请求的响应。例如,当平台发起位置订阅请求时,设备需要按照订阅时间间隔,实时上报当前位置信息。

视频采集与编码

  • 视频采集:使用 Android 设备的摄像头进行视频采集。可以通过 Camera 类或者更高版本的 Camera2 API 来获取摄像头的视频数据。设置视频的分辨率、帧率等参数,以满足实际需求。
  • 视频编码:对采集到的视频数据进行编码,使其符合 GB28181 标准要求的编码格式,如 H.264 或 H.265。在 Android 中,可以使用 MediaCodec 类进行硬件加速编码,提高编码效率。

数据传输

  • 建立连接:根据 GB28181 协议的要求,使用 SIP 协议建立与平台的会话连接。在连接建立过程中,需要指定传输协议(如 UDP 或 TCP)和端口号等信息。
  • 数据发送:将编码后的视频数据封装成 RTP 数据包,并通过建立的连接发送到 GB28181 平台。在发送过程中,需要注意网络状况,对数据进行适当的分包和组包处理,以确保数据的正确传输。

异常处理

  • 网络异常:当网络出现异常时,如网络断开或连接超时,需要及时进行重连或重新注册等操作,以保证数据的实时回传。
  • 设备故障:当设备出现故障或异常情况时,如摄像头故障或编码失败,需要及时进行错误处理,并向平台发送相应的错误报告。

总结

Android 上实现 GB28181 实时回传,我们从前期准备、信令交互、视频采集与编码、数据传输和异常处理这几个关键方面进行阐述。前期准备包括满足系统要求、添加权限、引入库文件和配置构建文件,为后续的开发提供基础环境。信令交互涵盖注册与登录、心跳机制和事件处理,确保设备与平台的正常通信。视频采集与编码部分介绍了如何利用 Android 设备的摄像头进行视频采集以及对采集到的数据进行编码。数据传输则说明了如何建立连接和发送数据。最后,异常处理考虑了网络异常和设备故障等情况的应对措施。以上是大概的设计思路,感兴趣的开发者,可以单独跟我沟通探讨。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/diannao/56384.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

简单说说mysql的mvcc

mvcc的实现依赖什么 事务版本号 每次事务开始之前&#xff0c;都会从数据库获取一个【自增长】的事务id&#xff0c;从这个版本号&#xff0c;可以判断事务的先后顺序 隐式字段 对于innodb存储引擎&#xff0c;每行记录都有两个隐藏列&#xff0c;分别是&#xff1a;trx_id…

java-day11

1.ArrayList 集合和数组的优势对比&#xff1a; 长度可变添加数据的时候不需要考虑索引&#xff0c;默认将数据添加到末尾 1.1 ArrayList类概述 什么是集合 ​ 提供一种存储空间可变的存储模型&#xff0c;存储的数据容量可以发生改变 ArrayList集合的特点 ​ 长度可以变化…

Canal 和 MySQL 配置指南

1. 环境依赖 在开始配置之前&#xff0c;请确保已安装并配置以下环境&#xff1a; Docker&#xff1a;用于运行 MySQL 和 Canal 的容器化服务。 MySQL&#xff1a;确保安装的是支持 binlog 的版本。 Canal&#xff1a;阿里巴巴开源的数据库增量订阅和消费组件。 2. MySQL …

基于ESP32的灌溉系统

精准灌溉优化与高效水资源利用&#xff1a;基于IoT的农业解决方案 引言 传统农业实践缺乏实时监控和高效操作&#xff0c;导致效率低下和产量不高。本项目旨在利用物联网&#xff08;IoT&#xff09;技术和低成本通信协议&#xff0c;设计一个解决方案来解决这一问题。提出的…

C++算法练习-day1——704.二分查找

题目来源&#xff1a;. - 力扣&#xff08;LeetCode&#xff09; 题目思路分析 二分查找是一种在有序数组中查找某一特定元素的搜索算法。搜索过程从数组的中间元素开始&#xff0c;如果中间元素正好是要查找的元素&#xff0c;则搜索过程结束&#xff1b;如果某一特定元素大…

Linux基础 -- 使用 cgroups 变更进程的CPU亲和性绑核

使用 cgroups 设置 CPU 绑定的教学文档 1. 使用 cgroups 设置 CPU 绑定 在 Linux 中&#xff0c;使用 cgroups 可以对进程进行 CPU 绑定&#xff0c;从而控制它们在哪些 CPU 核心上运行。以下是基本步骤&#xff1a; 创建 cgroup&#xff1a; mkdir /sys/fs/cgroup/cpuset/my…

Docker实践与应用举例

目录 1. 引言 2. Docker的基本概念 2.1 什么是Docker容器 2.2 Docker镜像 2.3 Docker架构 3. Docker的应用场景 3.1 开发与测试环境的隔离 3.2 持续集成与持续交付&#xff08;CI/CD&#xff09; 3.3 微服务架构 4. Docker的实践案例 4.1 部署Nginx反向代理 4.2 使用…

研发线上事故风险解读之缓存篇

专业在线打字练习平台-巧手打字通&#xff0c;只输出有价值的知识。 一 前言 本文继续基于《线上事故案例集》&#xff0c;进一步深入梳理线上事故缓存使用方面的问题点&#xff0c;重点关注缓存在使用和优化过程中可能出现的问题&#xff0c;旨在为读者提供具有实践指导意义的…

学习如何将Spring Boot Jar包注册成Windows服务

​ 博客主页: 南来_北往 系列专栏&#xff1a;Spring Boot实战 在开发Spring Boot应用时&#xff0c;我们通常通过命令行或IDE手动启动项目。然而&#xff0c;在生产环境中&#xff0c;为了提升效率和稳定性&#xff0c;我们更希望应用能够自动启动&#xff0c;并且作为Wi…

OpenCV高级图形用户界面(5)获取指定滑动条(trackbar)的当前位置函数getTrackbarPos()的使用

操作系统&#xff1a;ubuntu22.04 OpenCV版本&#xff1a;OpenCV4.9 IDE:Visual Studio Code 编程语言&#xff1a;C11 算法描述 返回滑动条的位置。 该函数返回指定滑动条的当前位置。 cv::getTrackbarPos() 函数用于获取指定滑动条&#xff08;trackbar&#xff09;的当前…

【H2O2|全栈】JS入门知识(二)

目录 JS 前言 准备工作 运算符 算数运算符 比较运算符 自增、自减运算符 逻辑运算符 运算符的优先级 分支语句 if-else语句 switch语句 三元表达式 结束语 JS 前言 本系列博客主要分享JavaScript的基础语法知识&#xff0c;本期为第二期&#xff0c;包含一些简…

Linux基础命令系列一小白必掌握

前言 为了有一个大概的复习框架所以先给出总的思维导图&#xff0c;如图&#xff1a; 目录 1.Linux的目录结构&#xff1f;Linux命令与命令行是什么&#xff1f;Linux命令基础格式&#xff1f; 2.ls命令 3.cd命令 4.mkdir命令 5.touch命令 6.cat命令 7.cp命令 8.mv命令…

大数据开发电脑千元配置清单

大数据开发电脑配置清单 电脑型号HUANANZHI 台式电脑操作系统Windows 11 专业版 64位&#xff08;Version 23H2 / DirectX 12&#xff09;处理器英特尔 Xeon(至强) E5-2673 v3 2.40GHz主板HUANANZHI X99-P4T&#xff08;P55 芯片组&#xff09;显卡NVIDIA GeForce GT 610 ( 2…

PLM预训练语言模型Pre-trained Language Model

预训练语言模型&#xff08;Pre-trained Language Model&#xff0c;PLM&#xff09; gpt就是一个典型的例子 一、PLM 的定义与概念 预训练语言模型是一种在大规模文本数据上进行无监督学习得到的语言模型。它通过学习语言的统计规律、语法结构和语义表示&#xff0c;为各种自…

模板方法模式、策略模式(C++)

模板方法模式&#xff1a; 定义&#xff1a;定义一个操作算法的框架&#xff0c;实现步骤延迟到子类中去实现 策略模式&#xff1a; 定义&#xff1a;定义一系列的算法&#xff0c;把它们一个个封装起来&#xff0c;并且使它们可相互替换。该模式使得算法可独立于使用它的客户…

开源GenImage的图片检测工具使用指南

引言 GenImage是一款开源的图片检测工具&#xff0c;旨在帮助用户在各种应用场景中进行图像处理和分析。该工具具有灵活性、可扩展性和高效性&#xff0c;适合从事计算机视觉、图像处理和深度学习的研究人员和开发者使用。本文将详细介绍如何安装、配置和使用GenImage进行图片…

深入剖析递归算法:原理、特点、应用与优化策略

在上一篇文章&#x1f449;【剖析十大经典二叉树题目】中&#xff0c;运用到了大量的递归算法&#xff0c;故本文将解析递归算法。 目录 &#x1f4af;引言 &#x1f4af;递归算法的定义与原理 ⭐定义 ⭐原理 &#x1f4af;递归算法的特点 ⭐简洁性 ⭐可读性 ⭐通用性 …

linux下编译鸿蒙版boost库

我在上一篇文章中介绍了curl和openssl的编译方式&#xff08;linux下编译鸿蒙版curl、openssl-CSDN博客&#xff09;&#xff0c;这篇再介绍一下boost库的编译。 一.环境准备 1.鸿蒙NDK 下载安装方式可以参考上篇文章&#xff0c;完毕后NDK的路径为&#xff1a;/home/ubuntu…

Java学习Day47:戏耍黑手道人(项目记录)

1.项目背景 2.技术选择 3.环境搭建 1.创建空项目 创建health_parent父文件用来控制依赖&#xff0c;类型为quickStart 打包方式为&#xff0c;pom&#xff1a;用在父级工程或聚合工程中&#xff0c;用来做jar包的版本控制&#xff0c;必须指明这个聚合工程的打包方式为pom。…

信息抽取数据集处理——RAMS

引言 RAMS数据集&#xff08;RAMS&#xff1a;Richly Annotated Multilingual Schema-guided Event Structure&#xff09;由约翰斯霍普金斯大学于2020年发布&#xff0c;是一个以新闻为基础的事件抽取数据集。它标注了9,124个事件&#xff0c;涵盖了139种不同的事件类型和65种…