h264码流及h265码流结构分析,NAL头类型分析

article/2025/9/28 0:07:30

视频编码标准规定了编码后码流的语法语义,也就阐明了从比特流提取语法元素并进行解释的方法,也就是视频的解码过程。
 
1.h264码流结构解析:
    H.264/AVC(Advanced Video Coding) 的功能分为两层:视频编码层(VCL, Video CodingLayer)和网络提取层(NAL, Network Abstraction Layer)。VCL数据即编码处理的输出,它表示被压缩编码后的视频数据序列。在VCL数据传输或存储之前,这些编码的VCL 数据,先被映射或封装进NAL单元中。每个NAL 单元包括一个原始字节序列负荷(RBSP, Raw Byte Sequence Payload)、一组对应于视频编码的NAL头信息。RBSP的基本结构是:在原始编码数据的后面填加了结尾比特。一个bit“1”若干比特“0”,以便字节对齐。
 
H.264BitsStream = StartCodePrefix + NALU + StartCodePrefix + NALU +...+     //StartCodePrefix为0x00000001或0x000001
NALU = NAL header(1 byte) + RBSP
RBSP = SODB  + RBSP trailing bits
NALU(NALU单元):Coded H.264 data is stored or transmitted as a series of packets known as NetworkAbstraction LayerUnits.
RBSP(原始数据字节流):A NALU contains a Raw Byte Sequence Payload, a sequence of bytes containingsyntax elements.
SODB(原始数据比特流):String Of Data Bits (SODB即编码形成的真实码流,长度不一定是8的倍数,故需要补齐)
 
NAL Header:forbidden_bit(1bit,禁止位),nal_reference_bit(2bit,NAL优先级), nal_unit_type( 5bit,类型,定义如下表)。
Nal_unit_type  NAL类型(rbsp语法结构的内容)                                      C    
0              未使用                                                       
1              不分区、非IDR图像的片(P:slice_layer_without_partitioning_rbsp()) 2,3,4
2              片分区A(slice_data_partition_a_layer_rbsp())                    2    
3              片分区B(slice_data_partition_b_layer_rbsp())                    3    
4              片分区C(slice_data_partition_c_layer_rbsp())                    4    
5              IDR 图像中的片(IDR:slice_layer_without_partitioning_rbsp())     2,3  
6              补充增强信息单元(SEI: sei_rbsp() )                               5    
7              序列参数集(SPS: seq_parameter_set_rbsp())                       0    
8              图像参数集(PPS: pic_parameter_set_rbsp())                       1    
9              分界符(access_unit_delimiter_rbsp())                            6    
10             序列结束(end_of_seq_rbsp())                                     7    
11             码流结束(end_of_stream_rbsp())                                  8    
12             填充(filler_data_rbsp())                                        9    
13~23          保留                                                        
24~31          未使用       
 
示例:
00000000h: 00 00 00 01 27 4D 00 33 E7 40 14 00 5A D3 50 10 ; ....'M.3鏎..Z覲.        //0x27(0 10 0111):  nal_unit_type=7(0111) 序列参数集(SPS)
00000010h: 20 2F 00 00 03 00 01 00 00 03 00 32 30 20 00 10 ;  /.........20 ..
00000020h: 4B E0 00 18 71 D7 FF F0 28 00 00 00 01 28 EE 3C ; K?.q??....(?              //0x28(0 10 1000):  nal_unit_type=8(1000) 图像参数集(PPS)
00000030h: 80 00 00 00 01 25 B8 40 00 39 6F 01 C3 64 CA FF ; €....%窣.9o.胐?       //0x25(0 10 0101):  nal_unit_type=5(0101) IDR图像(IDR)
...... ......
00007e60h: D9 91 D8 2A 31 D9 EF F0 00 00 00 01 21 E6 03 08 ; 賾?1亠?...!?.          //0x21(0 10 0001):  nal_unit_type=1(0001) 非IDR图像(P)
...... ......
 
 
2.h265码流结构解析:
    与H.264/AVC类似,H.265/HEVC( High Efficiency Video Coding)采用了视频编码层(Video Code Layer,VCL)和网络适配层(Network Abstract Layer,NAL),原始视频经过VCL层,被编码成视频数据,然后经过NAL层,封装成一个个NAL包以适应不同网络的视频传输。HEVC码流在应用过程中与H.264/AVC码流的区别就在于NAL层;NAL单元的头部容量从H.264/AVC的单字节扩充为两个字节,增加的内容主要用于标识它所装载数据的类型。
 
1、编码时的分层处理架构
    在对视频序列进行压缩的时候,会将其先分割成若干个小的图像组(GOP,Group of Pictures),定义一个GOP编码后生成的压缩数据为CVS(Coded Video Sequence);视频编解中,存在封闭式GOP和开放式GOP,每个图像组包含若干张图片,每张图片可以划分为一个或多个片(Slice),每个GOP分为若干个片(Slice),片与片之间进行独立编码,每个片由一个或者多个片段(SS,Slice Segment)组成;一个SS在编码时,被分割成大小相同的树形结构单元(CTU,Coding Tree Unit,CTU是HEVC新引进的概念),每个CTU按照四叉树分割方式分割成不同类型的编码单元(CU,Coding Unit);
 
2、压缩码流结构
    GOP层、Slice层中公用的大部分语法元素游离出来组成序列参数集(SPS,Sequence Paramenter Set)和图像参数集(PPS,Picture Paramenter Set);
SPS:包含了一个CVS中所有图像共用的信息,包括解码相关信息,如档次级别,分辨率deng;
PPS:包含了一幅图像所有的公共参数,即一个图像中的所有SS会使用同样的PPS,包括初始图像控制信息,如初始化量化参数(QP,Quantization Parament)、分块信息等;
VPS(Video Parament Set, 视频参数集):包含了多个子层共享的语法元素,其他不属于SPS的特定信息等(为了适应其他应用如可分级视频编码器,多视点视频编码器,HEVC语法架构中增加VPS)。
一个SS获取参数的引用顺序如下(实则上是一个树状的结构):SS <-- PPS <-- SPS <-- VPS
 
 
    NAL根据视频压缩数据的特性将其封装为不同的NALU,NALU除了承载VPS、SPS、PPS等信息,还有视频片(Slice)的压缩数据,承载视频片压缩数据的NALU被称为VCLU(VCL NALU),承载其它信息的压缩数据的NALU则被称为non-VCLU(non-VCL NALU)。H.265/HEVC下NALU包含两部分的结构: NALU头(Header)和负载(Payload),NALU头长度为固定的两个字节,反映NALU的内容特征,NALU负载长度为整数字节,承载视频压缩后的原始字节序列载荷(Raw Byte Sequence Payload,RBSP)。RBSP是对视频编码后的原始比特流片段SODB(STring OF Data Bits)进行添加尾部(添加结尾比特1,以凑足整字节)的包装。
 
h265头解析(2字节):
0byte             |1byte                               //h265的nal unit header有两个字节构成
0    1 2 3 4 5 6   7 0 1 2 3 4    5 6 7
+-+---------------+----------------+-------+
| F|      Type     |    LayerId    |  TID  |        //通常情况下F为0(1bit),layerid为0(6bit),  TID为1(3bit)
+-+---------------+----------------+-------+
 
H265 帧类型判断:int type = (code & 0x7E)>>1;  type值类型见下表:

 

 
示例:
00000000h: 00 00 00 01 40 01 0C 01 FF FF 21 40 00 00 03 00 ; ....@...!@....      //0x40(0  100000 0):  nal_unit_type=32(100000) 序列参数集( VPS)
00000010h: 90 00 00 03 00 00 03 00 96 25 02 40 00 00 00 01 ; ?......?.@....            //0x42(0  100001 0):  nal_unit_type=33(100001) 序列参数集( SPS)
00000020h: 42 01 01 21 40 00 00 03 00 90 00 00 03 00 00 03 ; B..!@....?.....
00000020h: 42 01 01 21 40 00 00 03 00 90 00 00 03 00 00 03 ; B..!@....?.....
00000030h: 00 96 A0 03 C0 80 10 E5 9E 96 E4 4A 17 80 B5 01 ; .枲.纮.鍨栦J.€?
00000040h: 02 02 E1 00 00 03 00 01 00 00 03 00 19 51 07 FD ; ..?.........Q.?
00000050h: E1 00 0D BF 80 00 14 9F 4D 7C 20 10 40 00 00 00 ; ?.縺..烳| .@...
00000060h: 01 44 01 C0 77 C0 E6 D9 00 00 00 01 26 01 AC 63 ; .D.纖梨?...&.琧     //0x26(0  010011 0):  nal_unit_type=19(010011) 序列参数集( IDR)
...... ......
000057c0h: 3C 47 CB 78 AC 66 95 CE D6 80 00 00 00 01 02 01 ; <G藊琭曃謤......    //0x02(0  000001 0):  nal_unit_type=1(000001) 序列参数集( P)
000057d0h: D0 08 55 A1 46 2A 7C A2 5D 52 71 1D 94 E7 B5 1A ; ?U*|Rq.旂?
...... ......
 
 
 
 
 
上传了一两个很常用的h264资料和软件,如下:

 

h264官方文档(中文): https://download.csdn.net/download/chengjian815/12922198

h265官方文档(英文):https://download.csdn.net/download/chengjian815/12922739

264码流分析工具:https://download.csdn.net/download/chengjian815/12922378

MP4封装信息查看:https://download.csdn.net/download/chengjian815/12922382

 
————————————————
版权声明:本文为CSDN博主「诗和远方-」的原创文章,遵循CC 4.0 BY-SA版权协议,转载请附上原文出处链接及本声明。
原文链接:https://blog.csdn.net/chengjian815/article/details/109069057


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

相关文章

H264/AVC NAL单元和解码

在264中&#xff0c;NAL是以NALU&#xff08;NAL unit&#xff09;为单元来支持编码数据在基于包交换技术网络中的传输的&#xff1b;它定义了符合传输层或存储介质需求的数据格式&#xff0c;同时提供头信息&#xff0c;从而提供了视频编码与外部世界的接口。网络层和传输层的…

获取NAL_UNIT的RBSP数据

从NAL UNIT中对rbsp获取的原理如图所示&#xff0c;此为NAL UNIT解析的架构图 头文件 #ifndef __NAL_UNIT_H__ #define __NAL_UNIT_H__#include <stdio.h>typedef struct Nal_Unit_Fops {int (*find_nal_unit_data)(FILE *file);int (*find_nal_unit_head)(char (*Q…

H.264——解析NAL Unit数据

目录 原理分析代码实现.c.h 效果 原理 视频编解码——NAL Unit结构分析 分析 1、首先去掉起始码得到NALU实际数据2、分离出NALU中一个字节的header 1bit禁止位、2bitNRI、5bitTYPE 3、解析剩余NALU的body部分 EBSP去除03->RBSP 代码实现 .c #include "LUX_TEST_…

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

一、引言 与H.264/AVC 类似&#xff0c;H265/HEVC也采用视频编码层&#xff08;Video Coding Layer&#xff0c;VCL&#xff09;和网络适配层&#xff08;Network Abstract Layer, NAL&#xff09;的双层结构&#xff0c;以适应不同网络环境和视频应用。网络适配层的主要任务是…

六、NAL Unit解析

参考标准文档&#xff1a;7.3和7.4节 一、NAL Unit结构 NAL Unit: NAL Unit NAL Header NAL Body NAL Header&#xff1a;一个字节&#xff0c;包括&#xff1a; forbidden_zero_bit&#xff1a;规定必须为0禁止位&#xff0c;1 bit;nal_ref_idc&#xff1a;第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标准中&#xff0c;视频流是由NAL(Network Abstraction Layer)单元组成的&#xff08;简称NALU&#xff09;&#xff0c;每个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视频编码标准中&#xff0c;整个系统框架被分为了两个层面&#xff1a;视频编码层面&#xff08;VCL&#xff09;和网络抽象层面&#xff08;NA…

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

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

NAL(网络自适应层)

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

H264的NAL解析

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

【Lua】xLua逻辑热更新

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

[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——热更新

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

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

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

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

Xlua

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

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

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

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

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