HEVC网络适配层介绍

news2024/11/24 12:08:17

h265 的分层结构

分层结构的目的

○ 网络类型多种多样,不同的网络环境具有不同的特性,压缩视频在其中进行传输必然会受到影响;比如不同网络的 MTU 有所不同;
○ 不同的应用场景对视频有不同的需求,视频业务会喜用不同的传输协议;

分层的重要性

○ 经过熵编码,码流中的二进制符号不再简单地对应实际数值,严重时当个符号的丢失或错误会导致后续数据无法正确解码;
○ 在网络上优化传输这种高度复杂的压缩视频流时,必须对码流进行深入分析或解码才能清楚不同数据的重要程度;但对码流进行深入分析甚至解码的计算复杂度太高,无法得到通用网络设备的支持。
在这里插入图片描述

VCL 与 NAL

○ H.265/HEVC也采用了视频编码层(Video Coding Layer, VCL)和网络适配层(Network Abstract Layer, NAL)的双层架构,以适应不同的网络环境和视频应用 。网络适配层的主要任务是对视频压缩后的数据进行划分和封装,并进行必要的标识,使其可以很好地适应复杂多变的网络环境。

NAL的作用机制

○ 一系列图像组成的原视频视频经过压缩编码 (VCL),接着根据压缩视频比特流的内容特性将其划分成多个数据段,对每个数据段进行封装并标识,就生成了 NALU,内容特性信息存放在 NALU 头信息中。
在这里插入图片描述

NAL 与 MTU

○ NAL的大小不一定与网络的MTU(MaximumTransmission Unit,最大传输单元)大小一致,因此网络分组与NALU 就产生几种组合形 式: 一个网络分组包含一个NALU ; 一个网络分组包含多个NALU,即多个NALU合并到一个网络分组;多个网络分组包含一个NALU,即一个NALU被分割到多个网 络分组。
○ 网络传输过程中,网络设备可以直接通过 NALU 的头信息获取 NALU 承载视频数据的内容特性,在此基础 上优化视频流的传输。

h265 图像类型

  1. 所有的压缩视频数据都被封装到不同的 NALU 的载荷部分,NALU 除了承载 VPS、SPS、PPS 等信息,主要承载视频片 Slice 的压缩数据;
  2. 承载视频片压缩数据的 NALU 称为 VCLU(VCL NALU),承载其他信息的 NALU 被称为 non-VCLU(non-VCL NALU);
  3. 随机介入点 IRAP
    ○ 从 IRAP (Intra Random Access Point)开始,后续视频流可独立正确解码,无须参考 IRAP 前面的视频信息,IRAP 后的第一幅解码图像被称为 IRAP 图像;
    ○ 根据播放和解码顺序,有可以将其他图像分为前置(Leading)图像、后置(Trailing)图像;其中前置图像又可以分为 RADL 图像和 RASL图像;
    ○ h265 规定了3 种 IRAP 图像:IDR 图像、CRA 图像、BLA 图像;
    ○ IRAP 图像把视频流分成多个相对对立 的区域,每个区域被称为 CVS(Coded Video Sequence),CVS 定义为两个相邻 IRAP 图像(且 NoRas1OutputFlag=1)之间的这段视频流;
  4. TSA/STSA
    ○ h265 的新增图像类型,用来标识时域子层切换点;
    在这里插入图片描述

网络适配层单元 NALU

  1. 每个 NALU 包含两部分:NALU 头(Header)和 NALU 载荷(Payload);
  2. SODB
    ○ 视频编码过程中输出包含不同内容的压缩数据比特流片段,这些比特流片段称为 SODB(String Of Data Bits);SODB 为最高为有效的存储形式,即字节内的比特按照从左到右、从高到低的顺序排列;
  3. RBSP
    ○ 在SODB(String Of Data Bits)后添加RBSP尾(rbsp trailing_bits)就生成了原始字节序列载荷(Raw Byte Sequence Payload,RBSP);RBSP尾由称为RBSP停止比特的 1 个比特和其后的0个或多个比特0组成。RBSP即为整数字节化的SODB , RBSP的数据类型即为SODB 的数据类型。
  4. EBSP
    ○ 在H265中,为了避免字节流片段和NALU的启起码及结束码发生冲突,需要对RBSP的字节流进行冲突处理 0x3,即EBSP为扩展字节序列载荷(Encapsulated Byte Sequence Payload),经过处理后的RBSP才可以直接作为NALU的负载信息,才可以进行磁盘保存和网络传输。
    ○ 因此实际最后的 NALU = Header + EBSP;
    在这里插入图片描述
  5. NALU 语法
    在这里插入图片描述

NALU Header

  1. 与h264相比,h265固定两字节的header,表征NALU的内容特征;
  2. 由定长的四部分组成:forbidden_zero_bit、nal_unit_type、nuh_layer_id、nuh_temporal_id_plus1;
    ○ forbidden_zero_bit占 1 比特,值应设置成 0,防止与 MPEG-2 系统的起始位冲突;
    ○ nal_unit_type占 6 比特,标识当前 NALU 载荷信息的内容特性,称为 NALU 类型;
    ○ nuh_layer_id占 6 比特,当前版本取值 0,未来可能勇于可分级视频或3D视频
    ○ nuh_temporal_id_plus1占 3 比特,时域标识,该值减 1表示 NALU 所在时域层的标识号 TemporalId不能为 0 ;
    在这里插入图片描述

帧类型解析

  1. 与h264的 & 01f不同,h265判断方式为:
    ○ int type = (code & 0x7E ) >> 1;// 0x7E的二进制的后8位是 0111 1110

  2. VPS:00 00 00 01 40 01 的nuh_unit_type的值为 32
    ○ 40 & 0x7E = (二进制)01000000 & 01111110 = 01000000
    ○ 01000000 >> 1 = 00100000
    ○ (转十进制)00100000 = 2^5 = 32

  3. SPS:00 00 00 01 42 01 的nuh_unit_type的值为 33
    ○ 42 & 0x7E = (二进制)01000010 & 01111110 = 01000010
    ○ 01000010 >> 1 = 00100001
    ○ (转十进制) 00100001 = 2^0 + 2^5 = 33

  4. PPS:00 00 00 01 44 01 的nuh_unit_type的值为 34
    ○ 44 & 0x7E = (二进制)01000100 & 01111110 = 01000100
    ○ 01000100 >> 1 = 00100010
    ○ (转十进制)00100010 = 2^1 + 2^5 = 34

  5. SEI:00 00 00 01 4E 01 的nuh_unit_type的值为 39
    ○ 4E & 0x7E = (二进制)01001110 & 0111110 = 01001110
    ○ 01001110 >> 1 = 00100111
    ○ (转十进制) 00100111 = 20+21+22+25 = 1+2+4+32 = 39

  6. IDR:00 00 00 01 26 01 的nuh_unit_type的值为 19

  7. 被参考图像(P帧或者B帧):00 00 00 01 02 01 的nuh_unit_type的值为 1

接入单元

○ h264 引入了接入单元(Access Unit, AU)的概念,定义为多个按解码顺序排列的 NALU,这些 NALU 解码正好生成一个图像;
○ AU 可以看成是压缩视频比特流的基本单位,压缩视频流由多个按顺序排列的 AU 组成。
在这里插入图片描述

参考

  1. 新一代高效视频编码H.265HEVC原理、标准与实现 [万帅,杨付正 编著] 2014年版.
  2. T-REC-H.265-202108-I.

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

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

相关文章

Llama 2 来袭 - 在 Hugging Face 上玩转它

🤗 宝子们可以戳 阅读原文 查看文中所有的外部链接哟! 引言 今天,Meta 发布了 Llama 2,其包含了一系列最先进的开放大语言模型,我们很高兴能够将其全面集成入 Hugging Face,并全力支持其发布。Llama 2 的社…

Sentinel Dashboard集成Nacos

1.前言 当项目上Sentinel Dashboard做流量监控的时候,我们可以通过Sentinel控制台修改限流配置,但当我们使用Nacos作为配置中心动态配置流控规则的时候,问题就来了。 首先我们要明白,Sentinel Dashboard的配置是从机器的内存中加…

go学习 3、基础数据类型

3、基础数据类型 基础数据类型:数字、字符串、布尔型复合类型:数组、结构体引用类型:指针、切片、字典、函数、通道接口类型 3.1 整型 有符号、无符号 int8/int16/int32/int64 uint8/uint16/uint32/units 64 Unicode字符rune类型是和int32…

R语言无法调用stats.dll的问题解决方案[补充]

写在前面 在去年10月份,出过一起关于R语言无法调用stats.dll的问题解决方案,今天(你看到后是昨天)不知道为什么,安装包,一直安装不了,真的是炸裂了。后面再次把R与Rstuido升级。说实话,我是真不…

整套停车位地磁检测方案出售,主控使用stm32驱动nb-iot模块bc95数据上传远程云服务器。

地磁车辆检测器,是车辆本身含有的铁磁物质会对车辆存在区域的地磁信号产生影响,使车辆存在区域的地球磁力线发生弯曲。当车辆经过传感器附近,传感器能够灵敏感知到信号的变化,经信号分析就可以得到检测目标的相关信息。 朋友创业…

安装github中的存储库作为Python包

第一步,安装git 安装教程:https://zhuanlan.zhihu.com/p/114068278 第二步,在github上复制该库的链接 第三步,使用命令行一键下载并安装包 pip install "githttps://github.com/openai/CLIP.git"如果当pip install…

笔记本充满电后,充电器可以长期不拔,会议安全隐患吗?

笔记本充满电后,一直插着不拔 1.建议人在身边可以暂时不拔,偶尔还是要使用电池当笔记本电池充满之后,电脑会自动使用电源供电,不会使用电池供电 2.笔记本电池都带有电池保护机制,在电池充满电后会自动停止充电 3.现在…

RNN架构解析——认识RNN模型

目录 RNN模型作用分类按照输入和输出的结构进行分类按照RNN的内部构造进行分类 RNN模型 RNN单层网络结构 作用 分类 按照输入和输出的结构进行分类 按照RNN的内部构造进行分类

Ftp和UDP的区别之如何加速文件传输

FTP(文件传输协议)是一种传输大文件的老方法,它的速度慢,而且容易受到网络环境的影响。在当今这个文件越来越大,项目交付时间越来越紧,工作分布在全球各地的时代,有没有办法让 FTP 加速呢&#…

JS学习第二部分

在前面,第一章节 ,学了JS的基本语法和一些常用的用法。在第二章节, 学了DOM,就是节点信息,教我们怎么在JS里面获取HTML的标签。接着,我们学习第三章节,怎么在JS里面对HTML的css样式进行操作。 …

3ds MAX NURBS曲线绘制鼠标

先引用一段大佬的话,解释为什么除了样条线还有这种曲线 NURBS是有理B-splines曲线https://www.zhihu.com/search?q%E6%9C%89%E7%90%86B-splines%E6%9B%B2%E7%BA%BF&search_sourceEntity&hybrid_search_sourceEntity&hybrid_search_extra%7B%22sourceT…

<Postman>Postman接口测试以及使用案例

说明:现在所有的系统都有登录token设置; 所以需要先进行登录,获取两个token; 关于token和refresh token 传统的认证方式一般采用cookie/session来实现,这是我们的出发点。 1.为什么选用token而不选用cookie/session…

OSI模型简介及socket,tcp,http三者之间的区别和原理

1.OSI模型简介(七层网络模型) OSI 模型(Open System Interconnection model):一个由国际标准化组织提出的概念模型,试图提供一个使各种不同的计算机和网络在世界范围内实现互联的标准框架。 它将计算机网络体系结构划分为七层,每…

spring 存储对象 + 获取对象

前言 本篇在spring中如何使用五大类注释与方法注释将对象加入IOC容器中,了解如何使用注释来获取容器中的Bean对象,如有错误,请在评论区指正,让我们一起交流,共同进步! 文章目录 前言1.通过注释将类加入IoC…

【C++ 重要知识点总结】自定义类型-类和结构体

类 类的基本特性 数据抽象和封装继承多态 1 类的构成——抽象 概念 数据抽象是一种依赖于接口和实现的分离的编程技术。类的接口包括用户所能执行的操作;类的实现包括类的数据成员、负责接口实现的函数体以及定义类所需要的的各种私有函数。封装实现了类的接口和实…

645. 错误的集合

645. 错误的集合 class Solution { public static int[] findErrorNums(int[] nums) {Arrays.sort(nums);int dup-1;int miss1;for (int i 1; i < nums.length; i) {if(nums[i]nums[i-1]){dupnums[i];}if(nums[i]-nums[i-1]>1){missnums[i]-1;}}return new int[]{dup,…

Vmware vSphere 5.0系列

Vmware vSphere 5.0 我们都用过 vmware workstation 这款产品&#xff0c;可以使我们安装很多虚拟机&#xff0c;但是 vmware 的核心产品远非局限于 workstation。 vSphere 是 VMware 推出的基于云的新一代数据中心虚拟化套件&#xff0c;提供了虚拟化基础架构、高可用性、集…

Tesseract开源的OCR工具及python pytesseract安装使用

一 、介绍 Tesseract是一款由Google赞助的开源OCR。 pytesseract是python包装器&#xff0c;它为可执行文件提供了pythonic API。 Tesseract 已经有 30 年历史&#xff0c;开始它是惠普实验室的一款专利软件&#xff0c;在2005年后由Google接手并进一步开发和完善。Tesseract支…

【Unity 实用插件篇】| 可视化图表插件XCharts (折线图、柱状图、饼图等)详细教学

前言 【Unity 实用插件篇】| 可视化图表插件XCharts (折线图、柱状图、饼图等)详细教学一、XCharts介绍1.1 特性1.2 相关网站链接1.3 效果展示 二、XCharts导入三、XCharts快速使用3.1 添加一个简单图表3.2 添加多个Seire3.3 给图表添加其他组件3.4 添加Serie组件&#xff0c;如…

什么是Maven,Maven的概述及基本使用

MAVEN 一、Maven简介1.1、Maven概述1.2、Maven仓库1.3项目获取jar包过程 二、Maven使用2.1Maven安装配置2.1.1配置环境变量2.1.2配置本地仓库2.1.3配置阿里云私服 2.2Maven基本使用2.2.1Maven常用指令2.2.2Maven生命周期 总结 一、Maven简介 Apache Maven是一个项目管理和构建…