GB/T28181-2022针对H.265编码细化及技术实现

news2024/12/23 15:54:07

技术背景

新版国家标准GB/T28181-2022《公共安全视频监控联网系统信息传输、交换、控制技术要求》已于2022年12月30日发布,并将于2023年7月1日正式实施。

国家标准GB/T28181-2022《公共安全视频监控联网系统信息传输、交换、控制技术要求》规定了公共安全视频监控联网系统(以下简称“联网系统”)的互联结构,传输、交换、控制的基本要求和安全性要求,以及控制、传输流程和协议接口等技术要求。适用于公共安全视频监控联网系统的方案设计、系统检测、验收以及与之相关的设备研发、生产。其他视频监控联网系统可参照执行。

新版国家标准GB/T28181-2022《公共安全视频监控联网系统信息传输、交换、控制技术要求》代替了GB/T28181—2016《公共安全视频监控联网系统信息传输、交换、控制技术要求》,与GB/T28181—2016相比,除结构调整和编辑性改动外,相关主要技术有一些变化。例如更改了标准范围,删除了“联网系统信息”“数字接入”“模拟接入”“模数混合型监控系统”“数字型监控系统”“监控点”“监控中心”的术语和定义,更改了“SIP监控域”“非SIP监控域”“级联”“互联”的术语和定义,更改了“SIP监控域互联结构示意图”,更改了“联网系统通信协议结构图”,媒体流通道增加了H.265、G.722.1、AAC等等。

GB/T28181-2022规范描述

基于RTP的视音频数据PS封装

基于RTP的PS封装首先按照ISO/IEC 13818-1:2019将视音频流封装成PS包,再将PS包以负载的方式封装成RTP包。

进行PS封装时,应将母个悦team Map),系统头和PSM放置于PS包头之后、第一十 ti(System Header)和 PSM(Program Stream Map),系统头和PSM放置于PS包头之后、第一个PES包

之前。

典型的视频关键帧PS包结构如图C.1所示,其中 PESV为视频PES包,PESA为音频PES包,视频非关键帧的PS包结构中一般不包含系统头和PSM。PS包中各部分的具体数据结构参见ISO/IEC13818-1 :2019中的相关描述。

 

系统头应包含对PS包中码流种类的描述,其中视频和音频的流ID(stream_id)取值如下:

a)视频流ID:0xEO;

b)音频流ID:0xCO。

针对本文件规定的几种视音频格式,PSM中流类型(stream_type)的取值如下:

a) MPEG-4视频流:0x10;

b)H.264视频流:0x1B;

c) SVAC视频流:0x80;

d)H.265视频流:0x24;

e)G.711A律音频流:0x90;

f)G.711U律音频流:0x91;

g)G.722.1音频流:0x92;

h)G.723.1音频流:0x93;

i)G.729音频流:0x99;

j)sVAC音频流:0x9B;

k)AAC音频流:0xOF。

PS包封装的其他具体技术规范详见ISO/IEC 13818-1:2019。

PS包的RTP封装格式参照IETF RFC 2250,RTP的主要参数设置如下:a)负载类型( payload type) :96;

b)编码名称(encoding name) ; PS;c)时钟频率(clock rate):90kHz;

d)SDP描述中“m”字段的“media”项:video。

基于RTP的视音频封装

H.265视频流的RTP封装

H.265的RTP载荷格式应符合IETF RFC 7798的相关规定。

H.265视频流RTP包的负载类型(Payload Type)标识号选定:从IETF RFC3551协议表5的动态范围(96~~127)中选择,建议定为100,根据实际需要填充。

H.265视频编﹑解码技术要求不再赘述,这里需要注意的是:为了保证码流解析的效率,比特流中应当在每个Ⅰ帧之前都出现相应的视频参数集(Video Param-eter Set,VPS)、序列参数集(Sequence Parameter Set, SPS)和图像参数集(Picture Parameter Set,PPS)。

技术实现

实际上,我们在实现GB28181-2016的时候,就已经支持了H.265编码,需要注意的是,由于H.265编码复杂度比较高,Android平台一般建议硬编码:

 

编码类型选择如下:

        //视频编码类型选择++++++++++
        videoEncodeTypeSelector = (Spinner)findViewById(R.id.videoEncodeTypeSelector);
        final String[] videoEncodeTypes = new String[]{"软编(H.264)", "硬编(H.264)", "硬编(H.265)"};
        ArrayAdapter<String> adapterVideoEncodeType = new ArrayAdapter<String>(this,
                android.R.layout.simple_spinner_item, videoEncodeTypes);
        adapterVideoEncodeType.setDropDownViewResource(android.R.layout.simple_spinner_dropdown_item);
        videoEncodeTypeSelector.setAdapter(adapterVideoEncodeType);

        videoEncodeTypeSelector.setOnItemSelectedListener(new AdapterView.OnItemSelectedListener() {

            @Override
            public void onItemSelected(AdapterView<?> parent, View view,
                                       int position, long id) {

                if (isRTSPPublisherRunning || isPushingRtmp || isGB28181StreamRunning || isRecording) {
                    Log.e(TAG, "Could not switch video encoder type during publishing..");
                    return;
                }

                videoEncodeType = position;
                Log.i(TAG, "[视频编码类型]Currently choosing: " + videoEncodeTypes[position] + ", videoEncodeType: " + videoEncodeType);
            }

            @Override
            public void onNothingSelected(AdapterView<?> parent) {

            }
        });

接口设计:

    /**
     * Author: daniusdk.com
     *
	 * Set Video H.265(hevc) hardware encoder, if support H.265(hevc) hardware encoder, it will return 0(设置H.265硬编码)
	 *
	 * @param kbps: the kbps of different resolution.
	 *
	 * @return {0} if successful
	 */
	public native int SetSmartPublisherVideoHevcHWEncoder(long handle, int kbps);

如果需要用native mediacodec编码,可以设置底层ndk硬编码模式:

	/**
	 * 设置视频硬编码是否使用 Native Media NDK, 默认是不使用, 安卓5.0以下设备不支持
	 * @param handle
	 * @param is_native: 0表示不使用, 1表示使用, sdk默认是0.
	 * @return {0} if successful
	 */
	public native int SetNativeMediaNDK(long handle, int is_native);

除此之外,我们针对H.264、H.265硬编码还做了更精细化的处理:

	/*
	* 设置视频硬编码码率控制模式
	* @param hw_bitrate_mode: -1表示使用默认值, 不设置也会使用默认值, 0:CQ, 1:VBR, 2:CBR, 3:CBR_FD, 请参考:android.media.MediaCodecInfo.EncoderCapabilities
	* 注意硬编码和手机硬件有关,多数手机只支持部分码率模式, 另外硬编码设备差异很大,不同设备同一码率控制模式效果可能不一样
	* @return {0} if successful
	*/
	public native int SetVideoHWEncoderBitrateMode(long handle, int hw_bitrate_mode);


	/*
	 * 设置视频硬编码复杂度, 安卓5.0及以上支持
	 * @param hw_complexity: -1表示不设置, 请参考:android.media.MediaCodecInfo.EncoderCapabilities.getComplexityRange() 和 android.media.MediaFormat.KEY_COMPLEXITY
	 * 注意硬编码和手机硬件有关,部分手机可能不支持此设置
	 * @return {0} if successful
	 */
	public native int SetVideoHWEncoderComplexity(long handle, int hw_complexity);

	/*
	 * 设置视频硬编码质量, 安卓9及以上支持, 仅当硬编码器码率控制模式(BitrateMode)是CQ(constant-quality mode)时才有效
	 * @param hw_quality: -1表示不设置, 请参考:android.media.MediaCodecInfo.EncoderCapabilities.getQualityRange() 和 android.media.MediaFormat.KEY_QUALITY
	 * 注意硬编码和手机硬件有关,部分手机可能不支持此设置
	 * @return {0} if successful
	 */
	public native int SetVideoHWEncoderQuality(long handle, int hw_quality);

	/*
	 * 设置H.264硬编码Profile, 安卓7及以上支持
	 * @param hw_avc_profile: 0表示使用默认值, 0x01: Baseline, 0x02: Main, 0x08: High, 0x10000: ConstrainedBaseline, 0x80000: ConstrainedHigh;
	 * 注意: ConstrainedBaseline 和 ConstrainedHigh 可能多数设备不支持,
	 * H.264推荐使用 High 或者 ConstrainedHigh, 如果您使用的手机硬解码解不了,那还是设置Baseline
	 * 如果设置的Profile硬编码器不支持,应编码器会使用默认值
	 * 具体参考:android.media.MediaCodecInfo.CodecProfileLevel
	 * @return {0} if successful
	 */
	public native int SetAVCHWEncoderProfile(long handle, int hw_avc_profile);

	/*
	 * 设置H.264硬编码Level, 这个只有在设置了Profile的情况下才有效, 安卓7及以上支持
	 * @param hw_avc_level: 0表示使用默认值, 0x100: Level3, 0x200: Level3.1, 0x400: Level3.2,
	 * 0x800: Level4, 0x1000: Level4.1, 0x2000: Level4.2,
	 * 0x4000: Level5, 0x8000: Level5.1,  0x10000: Level5.2,
	 * 0x20000: Level6, 0x40000: Level6.1,  0x80000: Level6.2,
	 * 如果设置的level太高硬编码器不支持,SDK内部会做相应调整
	 * 注意: 640*480@25fps最小支持的是Level3, 720p最小支持的是Level3.1, 1080p最小支持的是Level4
	 * 具体参考:android.media.MediaCodecInfo.CodecProfileLevel
	 * @return {0} if successful
	 */
	public native int SetAVCHWEncoderLevel(long handle, int hw_avc_level);

	/*
	 * 设置视频硬编码最大码率, 安卓没有相关文档说明, 所以不建议设置,
	 * @param hw_max_bitrate: 每秒最大码率, 单位bps
	 * @return {0} if successful
	 */
	public native int SetVideoHWEncoderMaxBitrate(long handle, long hw_max_bitrate);

外部调用如下:

int hevcHWKbps = setHardwareEncoderKbps(false, video_width_, video_height_);
hevcHWKbps = hevcHWKbps*fps/25;
Log.i(TAG, "hevcHWKbps: " + hevcHWKbps);

int isSupportHevcHWEncoder = libPublisher
		.SetSmartPublisherVideoHevcHWEncoder(publisherHandle, hevcHWKbps);

if (isSupportHevcHWEncoder == 0) {
	libPublisher.SetNativeMediaNDK(publisherHandle, 0);
	libPublisher.SetVideoHWEncoderBitrateMode(publisherHandle, 0); // 0:CQ, 1:VBR, 2:CBR
	libPublisher.SetVideoHWEncoderQuality(publisherHandle, 39);

	// libPublisher.SetVideoHWEncoderMaxBitrate(publisherHandle, ((long)hevcHWKbps)*1200);

	Log.i(TAG, "Great, it supports hevc hardware encoder!");
}

技术总结

GB28181-2022针对H.265编码说明,弥补了2016规范的不足,H.265编码,移动端软编特别是针对高分辨率帧率,性能瓶颈很大,更合理的方案是实现高效率的H.265硬编模式,GB28181-2022,让H.265支持终于体现在规范层面,有理有据,相信会有更广阔的用武之地。

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

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

相关文章

RocketMQ学习

各MQ 并发性能比较 吞吐量 kafka 17.3w/s rocketMQ 11.6w/s RabbitMQ 5.96w/s RocketMQ组件 broker 核心业务组件 nameServe 保存broker 的ip、端口、上下线信息等。 类似注册中心 启动nameServe 时会调用 runserver 启动broker &#xff0c;会默认读取/conf/broker.conf …

第3章“程序的机器级表示”:程序编码 和 数据格式

文章目录 3.2 程序编码3.2.1 机器级代码3.2.2 代码示例3.2.3 关于格式的注解 3.3 数据格式 3.2 程序编码 假设写一个 C 程序&#xff0c;有两个文件 p1.c 和 p2.c。然后用 Unix 命令行编译这段代码&#xff1a; unix> gcc -O2 -o p p1.c p2.c命令 gcc 表明的就是 GNU C 编…

嵌入式 Linux 入门(十一、make 和 MakeFile)

嵌入式 Linux 入门第十一课&#xff0c;Make 工具和 Makefile 的引入...... 矜辰所致目录 前言一、Linux 下多文件编译二、make 工具和 Makefile2.1 make 和 Makefile 是什么?2.2 通过 STM32 提前熟悉 Makefile2.3 GCC 与 make 的关系/区别&#xff1f; 三、一个简单的 Makefi…

〖Python网络爬虫实战㉙〗- Selenium案例实战(三)

订阅&#xff1a;新手可以订阅我的其他专栏。免费阶段订阅量1000 python项目实战 Python编程基础教程系列&#xff08;零基础小白搬砖逆袭) 说明&#xff1a;本专栏持续更新中&#xff0c;目前专栏免费订阅&#xff0c;在转为付费专栏前订阅本专栏的&#xff0c;可以免费订阅付…

OpenGL之着色器

文章目录 什么是着色器数据类型输入与输出Uniform三角形渐变色例子从文件中读取 什么是着色器 着色器是使用一种叫GLSL的类C语言写成的。GLSL是为图形计算量身定制的&#xff0c;它包含一些针对向量和矩阵操作的有用特性。着色器的开头总是要声明版本&#xff0c;接着是输入和输…

攻击面管理有多重要?从一个社工钓鱼的仿冒网站说起

2023年4月中旬&#xff0c;A企业紧锣密鼓地展开了重保前期的筹备。A企业是一家集团公司&#xff0c;业务范围广&#xff0c;资产众多&#xff0c;为了提前了解自身安全情况&#xff0c;探知未知风险&#xff0c;公司通过自身资产清单及配套手段对自身资产暴露情况进行了梳理。 …

总结springboot项目中一些后端接收前端传参的方法

文章目录 1、java方法入参里面什么注解都没有2、不使用&#xff1f;&来拼接参数&#xff0c;在参数中添加PathVariable注解3、RequestBody 先创建一个springboot项目&#xff0c;并在pom文件中添加web依赖&#xff1a; <dependency><groupId>org.springframewo…

Linux:LVM动态磁盘管理

Linux中的LVM是什么 LVM&#xff08;Logical Volume Manager&#xff09;是Linux系统中的一种动态分区技术&#xff0c;它允许将多个物理硬盘上的存储空间组合成一个或多个逻辑卷&#xff08;Logical Volume&#xff09;&#xff0c;并且可以在运行时对逻辑卷进行调整。LVM的设…

Unity UI -- (7) 创建世界空间UI

目前为止&#xff0c;我们已经设计了一个屏幕空间UI&#xff08;Screen Space UI&#xff09;。一个屏幕空间UI会在屏幕上平坦放置&#xff0c;它会被渲染到环境中所有东西的上面&#xff0c;无论相机位置在哪里。 而一个世界空间UI&#xff08;World Space UI&#xff09;能够…

什么是半实物仿真平台自动驾驶半实物仿真平台有哪些?

文章目录 半实物仿真平台介绍自动驾驶半实物仿真平台介绍1.CARLA2.AirSim3.LGSVL Simulator 半实物仿真平台介绍 半实物仿真平台是一种综合利用虚拟仿真和实际硬件设备的仿真系统。它将虚拟环境和真实硬件设备结合起来&#xff0c;旨在提供更真实、更准确的仿真体验。 在半实…

Hack The Box真实靶机环境搭建教程

Hack The Box真实靶机环境搭建教程 1.开启测试靶机的方法2.Windows连接HTB3.Kali连接HTB 1.开启测试靶机的方法 在机器列表中选择一台主机&#xff1a; 选择加盟主机&#xff1a; 靶机开启成功&#xff1a; 2.Windows连接HTB 下载安装OpenVPN&#xff1a; 下载VPN&#xff08…

Linux---文本处理命令(grep、wc、管道符 |)

1. grep命令 grep命令能够在一个或多个文件中&#xff0c;搜索某一特定的字符模式&#xff08;也就是正则表达式&#xff09;&#xff0c;此模式可以 是单一的字符、字符串、单词或句子。 注意&#xff1a;在基本正则表达式中&#xff0c;如通配符 *、、{、|、( 和 )等&#…

【STM32G431RBTx】备战蓝桥杯嵌入式→决赛试题→第十三届

文章目录 前言一、题目二、模块初始化三、代码实现interrupt.h:interrupt.c:main.h:main.c: 四、完成效果五、总结 前言 无 一、题目 二、模块初始化 1.LCD这里不用配置&#xff0c;直接使用提供的资源包就行 2.ADC:开启ADCsingle-ended 3.LED:开启PC8-15,PD2输出模式就行了…

从前序与中序遍历序列构造二叉树(java)

从前序与中序遍历序列构造二叉树 leetcode 105 题-原题链接题目描述解题思路往期经典二叉树递归题目&#xff1a; leetcode 105 题-原题链接 从前序与中序遍历序列构造二叉树 题目描述 给定两个整数数组 preorder 和 inorder &#xff0c;其中 preorder 是二叉树的先序遍历&a…

【论文阅读系列】NWD-Based Model | 小目标检测新范式,抛弃IoU-Based暴力涨点(登顶SOTA) 计算机视觉

NWD-Based Model | 小目标检测新范式&#xff0c;抛弃IoU-Based暴力涨点(登顶SOTA) 计算机视觉 参考&#xff1a;博客1 知乎2 在这里进行纪录分享&#xff0c;这是有用的资料&#xff0c;避免之后再寻找相当麻烦。 小目标检测是一个非常具有挑战性的问题&#xff0c;因为小目…

监控易:信创工程,几十万台终端设备桌面集中监控运维方案​

监控易&#xff1a;信创工程&#xff0c;几十万台终端设备桌面集中监控运维方案 从2019年开始,我国因国际国内形势的迫切要求,在信息和网络安全方面启动 “安全可靠工程”,全面深入推进信创运维及相关产品国产化。时至今日&#xff0c;已取得令世人瞩目的成果。 过去&#xff…

learn_C_deep_14 (条件编译的基本使用与理解)

目录 条件编译 1.条件编译如何使用&#xff1f; 2.为何要有条件编译? 3. 条件编译都在哪些地方用? 条件编译 1.条件编译如何使用&#xff1f; C语言的条件编译是一种在程序编译时根据条件选择不同代码段进行编译的技术。条件编译可以用于实现代码跨平台&#xff0c;开启…

C++小知识点(auto关键字)

&#x1f339;作者:云小逸 &#x1f4dd;个人主页:云小逸的主页 &#x1f4dd;Github:云小逸的Github &#x1f91f;motto:要敢于一个人默默的面对自己&#xff0c;强大自己才是核心。不要等到什么都没有了&#xff0c;才下定决心去做。种一颗树&#xff0c;最好的时间是十年前…

猿创征文|Spring系列框架之面向切面编程AOP

⭐️前面的话⭐️ 本篇文章将介绍一种特别重要的思想&#xff0c;AOP&#xff08;Aspect Oriented Programming&#xff09;&#xff0c;即面向切面编程&#xff0c;可以说是OOP&#xff08;Object Oriented Programming&#xff0c;面向对象编程&#xff09;的补充和完善。 …

Springcloud1---->Zuul网关

目录 简介加入zuul后的架构快速入门添加Zuul依赖编写zuul启动类编写zuul配置文件编写路由规则 面向服务的路由添加Eureka客户端依赖开启Eureka客户端发现功能添加Eureka配置&#xff0c;获取服务信息修改映射配置&#xff0c;通过服务名称获取 简化的路由配置过滤器使用场景自定…