视频编码标准规定了编码后码流的语法语义,也就阐明了从比特流提取语法元素并进行解释的方法,也就是视频的解码过程。
 
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

h264码流及h265码流结构分析,NAL头类型分析相关推荐

  1. Wireshark如何导出h264码流和h265码流

    是对别人写的插件和导出方法的一个总结吧,以下方法亲测有效,属于转载! 导出264的方法请参考原文博客:https://blog.csdn.net/volvetandanny/article/detai ...

  2. python小工具------将H264/H265码流文件转为一帧一帧的JPEG文件

    一.功能 输入H264/H265码流路径,此脚本可以将对应的码流转为一帧一帧的JPEG文件,并保存到指定路径. 二.具体实现 import av import sysdef h265ToJpg_dem ...

  3. H264/H265码流类型

    文章目录 H.264码流 H.264码流格式 Annex B AVCC H.265码流 H.264码流 H264中,NALU类型1-5为视频帧,其余则为非视频帧.在解码过程中,我们只需要取出NALU头 ...

  4. H265码流结构分析

    文章目录 1 准备工作 1.1 H265视频文件 1.2 参考文档 1.3 参考博文 2 分析 2.1 NALU type 2.1.1 H264 2.1.2 H265 2.2 实例分析 最近了解了一下 ...

  5. mp4box 封装H265码流

    一般我用HM编码出来的H265码流是NAL封装的裸码流, 但播放器处理的往往是有封装的码流.之前,我们傻傻地在播放器中间件里面搞了一套处理裸码流的parser, 随着各种需求的增多,感觉这是东西有些多 ...

  6. 音视频开发——H265码流解析

    概述 H.265技术的应用 编码技术主要运用于视频播放设备.软件应用以及拍摄.录制视频的设备.人们最熟悉的莫过于PPS网络视频播放器.在PC屏客户端产品上面,PPS已经于2013年初推出了基于H.26 ...

  7. 从原理到实践:使用Mediacodec编码H265并实现解码H265码流

    H265 H265,也称为HEVC(High Efficiency Video Coding),是一种高效视频编码格式.它是H264(AVC)的后继者,也是ITU-T和ISO/IEC联合开发的标准.相 ...

  8. H265码流RTP封装方式详解

    文章目录 H265码流RTP封装方式详解 1 H265编码方式介绍 2 H265码流RTP封装方式 2.1 单一帧封装模式 2.2 组合帧封装方式 2.3 分片封装模式 2.4 代码片段解析 H265 ...

  9. H.264/H265码流解析

    H.264/H265码流解析 一.H.264码流解析 一个原始的H.264 NALU 单元常由 [StartCode] [NALU Header] [NALU Payload] 三部分组成 一个原始的 ...

最新文章

  1. 史上最受程序员待见的计算机入门读物——图解X系列
  2. BZOJ1295 [SCOI2009]最长距离
  3. kafka基本操作:创建topic、生产/消费消息(同一消费组均分消息;不同消费组订阅消息)
  4. Java按规则生成唯一编号
  5. 图幅号与经纬度的换算
  6. 雷电3接口能干嘛_acasis阿卡西斯推出首款雷电3接口WIFI6网卡:内置Intel AX200
  7. atcoder 2643 切比雪夫最小生成树
  8. Flash与数学:圆(2)
  9. 程序设计竞赛中常用的STL汇总
  10. IPTV 质量评价方法已经不适用于 OTT TV 质量评价
  11. Vue之Promise
  12. ZeroClipboard实现复制
  13. ArcGIS 10.5 及 ArcGIS Server下载安装破解环境配置
  14. 计算机时间与网络时间无法同步,电脑时间与网络时间不同步解决办法
  15. “大菜汪”1 个就霸屏,手机QQ上线新表情
  16. 表单环境外访问Xrm.Page.context对象
  17. 固态硬盘的计算机需要进行磁盘碎片整理吗,SSD固态硬盘需要碎片整理吗 固态盘切忌磁盘碎片整理...
  18. 解决每次上线更新文件需要手动清除缓存的问题-------js 、css自动清除浏览器缓存方法
  19. Android 抱歉,xxx已停止运行 源码分析
  20. bfs hrbust 2188

热门文章

  1. 剑指offer----C语言版----第十天
  2. win7清理系统缓存,复制到一个文件,把文件后缀为.bat
  3. 智能OCR文字识别训练平台
  4. javax.mail.MessagingException: Could not connect to SMTP host: smtp.xdf.cn
  5. 惊恐,还真有大神把地府后台管理系统做出来了,“阎王爷”疯狂点赞!附地址...
  6. 【Android容器组件—ScrollView】
  7. 【python】有名元祖
  8. Python 爬虫学习08 将爬取到的数据保存到SQL
  9. Solidity语言学习笔记————20、函数修饰符
  10. 众多技术我该学那样?(转)