H265/HEVC编码NAL的单元的介绍

article/2025/9/28 0:26:27

一、引言

与H.264/AVC 类似,H265/HEVC也采用视频编码层(Video Coding Layer,VCL)和网络适配层(Network Abstract Layer, NAL)的双层结构,以适应不同网络环境和视频应用。网络适配层的主要任务是对视频压缩后的数据进行划分和封装,并进行必要的标识,使其更好的适应各种网络环境。

二、NAL单元的基本结构

从NAL单元的基本结构可知,NAL单元由NAL头和原始字节序列负载(Raw Byte sequence payload,RBSP)

三、NAL头的语法定义

forbidden_zero_bits(1bit)

默认为0,值为1时表示错误,当网络发现NAL单元有比特错误时可设置该比特为1,以便接收方纠错或丢掉该单元

nuh_layer_id(6bit)

layerId预留位,用来指示VCL数据属于哪个层或者标识non-VLC数据占用NALU header的第一个字节的最后一位和第二个字节的前五位,默认全为0,用于未来扩展,如用来表示可分级视频或3D视频等

nuh_temporal_id_plus1(3bit)

该字段默认为1。temporal_id表示NAL单元的时域层级,根据图像时域层级就可以确定其重要性,如时域层级小的图像不会参考时域层级大的图像,如通常参数集或者idr帧的temporal_id为0。

nal_unit_type(6bits)

用来标识NAL单元类型。通常NAL单元类型包括参数集(VPS,PPS,SPS,SEI)以及slice 数据(如IDR,其他类型帧等)。

由上可知,H265的NAL的类型相对h264多了很多,取值从0~63,其中48~63语义尚未明确,不会影响解码过程。这里总结一下H265的帧相关概念

IRAP:随机接入点(Intra Random Access point),其后置图像必须能独立正确解码。

Leading前置图像:解码在后,播放在前(类似B帧)。

TAIL后置图像:解码和播放都在其后。

RADL(Random Access Decoder Leading):不依赖IRAP前的前置图像,即从IRAP图像介入可以正确解码。

RASL(Random Access skip Leading):依赖IRAP前的前置图像,即从IRAP图像介入不可以正确解码。

IRAP分三种:

IDR(instantaneous decoder refreshing):IDR不依赖IDR帧前的图像解码,h264也有IDR帧概念。

CRA(clean Random access):允许其前置图像是RASL,以提高编码效率,当直接从CRA图像接入时,其RASL图像无法解码。

BLA(Broke Link access):特殊的CRA,明确其RASL不需要解码

TSA(Temporal sub-layer access):该图像可以切换到时域层大于或等于该图像时域层标识号的时域层

STSA(Step wise Temporal sub-layer access):从该图像切换该图像所属的时域层。

四、NAL单元的负载

视频编码输出的包含不同内容的数据比特流片段,这些比特流片段为SODB(String Of Data Bits),SODB 从左到右、从高到低顺序排列。在SODB后添加一些一个bit的停止比特和多个0,就形成了RBSP。

RBSP生成规则如下:

  1. 如果SODB为空,生成的RBSP也是空
  2. RBSP第一个字节直接取SODB最左端的8bit,第二个字节取SODB接下来的8bit,以此类推,直接到SODB所剩下的内容不足8bit为止。
  3. RBSP的下一个字节首先包含SODB的最后比特,然后添加比特1(RBSP停止位)。如果该字节包含比特数小于9,在后面添加0直到该字节包含8比特。

RBSP可以包含SS的压缩数据,也可以包含VPS,PPS,SPS,SEI等。

注意RBSP可以不能直接NAL单元负载,还有解决冲突问题。一般编码器输出端的NAL单元是带启动码0x000001或者0x000001。或者系统保留某些数据(如0x000002)。RBSP做了以下冲突处理:

0x000000->0x00000300;

0x00001->0x00000301;

0x000002->0x00000302;

 0x000003->0x00000303;

五、参数集
H265/HEVC包含参数集(VPS,SPS,PPS,SEI),相比h264多了一个VPS。
1)VPS(视频参数集)
主要用传输视频分级信息,有利于兼容可分级视频以及3D视频,如视频包含最大的层级,也可包含profile,level等信息。一个给定的视频序列,无论它的SPS是否相同,都参考相同的VPS
2)SPS(序列参数集)
主要包含一个CVS(Code Video Sequence 编码视频序列,类似GOP)所有编码图像共享的编码参数,SPS通过PPS引用而作用图像
3)PPS(图像参数集)
一副图像序列,slice 通过引用PPS进行解码

 VPS,SPS,PPS和SS存在各级引用关系,一副图像中的所有SS引用同一个PPS,一个CVS中所有PPS引用同一个SPS。同一个视频序列中的所有SPS引用一个VPS。VPS,SPS,PPS存在相同参数,后者会覆盖前者。

六、h265的数据分析

以下是一个h265的视频序列打开的NAL类型如下

以上就是关于h265/hevc的NAL单元的介绍更多更详细请关注公众号AV_Chat


http://chatgpt.dhexx.cn/article/bJ0WT2L9.shtml

相关文章

六、NAL Unit解析

参考标准文档:7.3和7.4节 一、NAL Unit结构 NAL Unit: NAL Unit NAL Header NAL Body NAL Header:一个字节,包括: forbidden_zero_bit:规定必须为0禁止位,1 bit;nal_ref_idc:第2和3位&#…

VCL和NAL

VCL和NAL 1.VCL只关心编码部分,重点在于编码算法以及特定硬件平台的实现,VCL输出的是编码后的纯视频流信息,没有任何冗余头信息。 NAL关心是是VCL的输出纯视频流如何被表达和封包以利于网络传输。 封包目的别人知道怎么传输和解码 (1)SODB:string of Data Bits (2)RBSP…

h264 NAL解析

目录 1 AVCC与Annex-B标准 2 slice 2.1 slice header 3 elecard工具解析示例 H.264标准中,视频流是由NAL(Network Abstraction Layer)单元组成的(简称NALU),每个NALU中可能是IDR图像、SPS、PPS、non-IDR图像等。 1 AVCC与Ann…

H264(NAL简介与I帧判断)

http://blog.csdn.net/jefry_xdz/article/details/8461343 1、NAL全称Network Abstract Layer, 即网络抽象层。 在H.264/AVC视频编码标准中,整个系统框架被分为了两个层面:视频编码层面(VCL)和网络抽象层面(NA…

H.264(NAL简介与I帧判断)

H.264(NAL简介与I帧判断) 1、NAL全称Network Abstract Layer, 即网络抽象层。 在H.264/AVC视频编码标准中,整个系统框架被分为了两个层面:视频编码层面(VCL)和网络抽象层面(NAL)。其中,前者负责…

NAL(网络自适应层)

(1)整个系统框架被分为了两个层面:视频编码层面(VCL)和网络抽象层面(NAL)。其中,前者负责有效表示视频数据的内容,而后者则负责格式化数据并提供头信息,以保证…

H264的NAL解析

一、NAL全称Network Abstract Layer, 即网络抽象层。 在H.264/AVC视频编码标准中,整个系统框架被分为了两个层面:视频编码层面(VCL)和网络抽象层面(NAL)。其中,前者负责有效表示视频数据的内容&…

【Lua】xLua逻辑热更新

1 前言 Lua基础语法 中系统介绍了 Lua 的语法体系,ToLua逻辑热更新 中介绍了 ToLua 的应用,本文将进一步介绍 Unity3D 中基于 xLua 实现逻辑热更新。 逻辑热更新是指:在保持程序正常运行的情况下,在后台修改代码逻辑,修…

[Unity实战]一个好用的lua/xlua/tolua/slua调试工具vscode-luaide-lite插件 好用到飞起..[Unity-Debug+Xlua-Debug][开箱可用]

[Unity实战]一个好用的lua调试工具vscode-luaide-lite插件 好用到飞起..[Debug][开箱可用][xlua] 简介官方例子:xlua/tolua/slua/lua5.1等1.安装2.配置3.使用3.1启动unity3.2vscode-debug:Unity Editor3.3vscode-debug:3.4运行unity进入断点... 4.核心代码:5.github地址 简介 l…

XLua——热更新

什么是热更新? 游戏上线后,出现游戏Bug或者需要更新小版本内容,游戏如果没有做热更新支持的话,就需要重重新打包游戏,然后上传平台进行审核,审核通过后玩家才可以下载新版本。审核期间需要时间,…

通过Xlua插件运行lua程序

using System.Collections; using System.Collections.Generic; using UnityEngine; using XLua; //引入xlua命名空间 public class Creat : MonoBehaviour {private LuaEnv luaenv;void Start(){luaenv new LuaEnv(); //LuaEnv可以理解为lua的运行环境luaenv.DoString("…

xlua基础知识

1.1 xLua简介 xLua是由腾讯维护的一个开源项目,xLua为Unity、 .Net、 Mono等C#环境增加Lua脚本编程的能力,借助xLua,这些Lua代码可以方便的和C#相互调用。自2016年初推广以来,已经应用于十多款腾讯自研游戏,因其良好性…

[Unity XLua]热更新XLua入门(一)-基础篇

无意中发现了一个巨牛巨牛的人工智能教程,忍不住分享一下给大家。教程不仅是零基础,通俗易懂,小白也能学,而且非常风趣幽默,还时不时有内涵段子,像看小说一样,哈哈~我正在学习中&…

Xlua

有一个项目做完快上线了,不是lua写的,能热更新的东西就特别少,如果遇到bug也很难在第一时间热修复,所以我就接入了Xlua这个插件点击打开链接 原本只是想热修复一下的,后来领导要求把逻辑系统的C#代码全部换成了Lua,至于为什么,因为他们习惯了每天都更新和修改的开发模式...所以…

xLua热更新(二)实现热更新

一、环境配置 要实现热更新功能,我们首先需要开启热更新的宏。操作方法是在「File->Build Settings->Player Settings->Player->Other Settings->Scripting Define Symbols」选项中添加HOTFIX_ENABLE 开启后,在xLua的菜单中就出现了「…

Unity 热更新技术 |(六)xLua框架学习最新系列完整教程

🎬 博客主页:https://xiaoy.blog.csdn.net 🎥 本文由 呆呆敲代码的小Y 原创,首发于 CSDN🙉 🎄 学习专栏推荐:Unity系统学习专栏 🌲 游戏制作专栏推荐:游戏制作 🌲Unity实战100例专栏推荐:Unity 实战100例 教程 🏅 欢迎点赞 👍 收藏 ⭐留言 📝 如有错误敬…

xLua(九)——实战

一:使用xLua的步骤 ——导入xLua插件 其实xLua本质就是一个Unity工程,把Asset中的文件导入到Unity工程中就搞定了(导入之后编辑器菜单栏会扩展出一个XLua选项) ——添加宏File——Build Settings——Player Settings——Other Se…

【XLua】简单使用

文章目录 前言1 配置1.1 配置宏1.2 XLua配置 2 lua和C#相互调用2.1 XLua.CSharpCallLua2.2 XLua.LuaCallCSharp 3 加载器 前言 XLua本质上是为Unity提供了使用lua的能力,实际多用于热更新。 热更新,因为要给代码打标签才能生效,所以需要预测…

xLua介绍

xLua地址:传送门 Xlua是啥? 2016年 腾讯推出的 一种 unity下 lua 编成的解决方案 基本概念介绍: 1.模块 模块就是一个 程序库,可以通过 require 加载,得到了一个表示 table的全局变量 这个table 就像一个命名空间&am…

Lua快速入门篇(XLua教程)(Yanlz+热更新+xLua+配置+热补丁+第三方库+API+二次开发+常见问题+示例参考)

《Lua热更新》 ##《Lua热更新》发布说明: “Lua热更新”开始了,立钻哥哥终于开始此部分的探索了。 作为游戏发布迭代的重要技术:Lua热更新在网络游戏迭代更新中非常重要,特别是对于AppStore这样的平台,我们只需要定…