承接上集

h.264 NALU详细分析1_杀神李的博客-CSDN博客

上集我们已经讲到了帧是由一个或者多个NALU组成 并且NALU除了存储帧的信息外 还会存储一些其他的信息 比如 SEI SPS PPS 看到这些名词别急 等会我会一一解释

⼀个原始的H.264 NALU单元通常由[StartCode] [NALU Header] [NALU Payload]三部分组成,其中 Start Code ⽤于标示这是⼀个NALU 单元的开 始,必须是"00 00 00 01" 或"00 00 01",除此之外基本相当于⼀个NAL header + RBSP;

注意 我上文说的是通常由  [StartCode] [NALU Header] [NALU Payload] 这三部分组成 但是在某些情况下 是没有StartCode这个字段的 初学者不用考虑 继续看文章 下文省略掉StartCode  ps:对于FFmpeg解复⽤后,MP4⽂件读取出来的packet是不带startcode,但TS⽂件读取出来 的packet带了startcode

NALU结构单元的主体结构如下所示(除去StartCode):

首先我们来看NAL header里的信息 NAL header只占一个字节

 T为负荷数据类型,占5bit 这是表明了这个NALU所携带的信息到底是啥 比如可以是I帧 B帧 P帧 或者其他SEI SPS PPS之类的信息 NALU不一定非要存储帧信息

R为重要性指示位,占2个bit 取00~11,似乎指示这个NALU的重要性,如00的NALU解码器可以丢弃它⽽不 影响图像的回放,0~3,取值越⼤,表示当前NAL越重要,需要优先受到保护。如果当前 NAL是属于参考帧的⽚,或是序列参数集(SPS),或是图像参数集(PPS)这些重要的单位时,本句法元 素必需⼤于0。

发I帧之前,⾄少要发⼀次SPS和PPS。否则无法解析 否则无法解析 否则无法解析 

最后的F为禁⽌位,占1bit forbidden_zero_bit: 在 H.264 规范中规定了这⼀位必须为 0

有些地方看不懂没关系 比如序列参数集 图像参数集啥的 等会我还会解释

我们来看一个例子 当NAL header的值为67时 他的头部信息表示什么意思呢

67:

转换为⼆进制:0110 0111

F=0 禁止位

R=11=3(十进制) 表示有点重要

T=00111= 7(⼗进制) 7对应的NALU的类型需要去查表 表如下所示 查表可得他是一个SPS NALU单元

T NAL 单元和 RBSP 语法结构的内容
0 未指定
1 ⼀个⾮IDR图像的编码条带 slice_layer_without_partitioning_rbsp ( )
2 编码条带数据分割块A slice_data_partition_a_layer_rbsp( )
3 编码条带数据分割块B slice_data_partition_b_layer_rbsp( )
4 编码条带数据分割块C slice_data_partition_c_layer_rbsp( )
5 IDR图像的编码条带(⽚) slice_layer_without_partitioning_rbsp ( )
6 辅助增强信息 (SEI) sei_rbsp( ) 用的比较多
7 序列参数集 seq_parameter_set_rbsp( ) 也就是SPS
8 图像参数集 pic_parameter_set_rbsp( ) 也就是PPS
9 访问单元分隔符 access_unit_delimiter_rbsp( )
10 序列结尾 end_of_seq_rbsp( )
11 流结尾 end_of_stream_rbsp( )
12 填充数据 filler_data_rbsp( )
13 序列参数集扩展seq_parameter_set_extension_rbsp( )
14-18 保留
19 未分割的辅助编码图像的编码条带 slice_layer_without_partitioning_rbsp ( )
20-23 保留
24-31 未指定

SPS即Sequence Paramater Set,又称作序列参数集。SPS中保存了一组编码视频序列(Coded video sequence)的全局参数。所谓的编码视频序列即原始视频的一帧一帧的像素数据经过编码之后的结构组成的序列。而每一帧的编码后数据所依赖的参数保存于图像参数集中。一般情况SPS和PPS的NAL Unit通常位于整个码流的起始位置。但在某些特殊情况下,在码流中间也可能出现这两种结构,主要原因可能为:

1.解码器需要在码流中间开始解码;

2.编码器在编码的过程中改变了码流的参数(如图像分辨率等);

总而言之 这两个东西保存了一些全局参数和配置信息 必须要先有SPS和PPS才能解析接下来的I帧 关于SPS和PPS详细解析 以后我还会出文章 同理 这两个东西也不是初学者应该去深入了解的 

接下来我们还会去分析NAL header后的RBSP  Raw Byte Sequence Payload  原始数据字节流

接下来的文章就请看NALU详细分析3了

h.264 NALU详细分析2相关推荐

  1. H.264码流分析及编解码调试

    一.H.264码流分析 1. 选择一个.mp4或者.264文件. 2. 在码流分析仪软件中打开该文件,从几个层次进行分析: (1) 分析SPS和PPS里都包含哪些主要的信息,给出参数值.(例如分辨率. ...

  2. RTMP FLV H.264 NALU GOP

    RTMP GOP (通常是 2倍的帧率, 2s左右) GOP说白了就是两个I帧之间的间隔.比较说GOP为120,如果是720p60的话,那就是2s一次I帧. IDR帧是I帧,但I帧不一定是IDR帧,比 ...

  3. H.264 NALU分隔Annex B和avcC

    文章目录 分隔格式 Annex B avcC 编解码器的输入输出分隔符类型 分隔格式 H.264常用的分隔方式有Annex B和avcC Annex B 这种分隔符通常用于视频会议还有文件存储例如TS ...

  4. 【数据压缩】第九次作业——H.264码流分析

    目录 1. 选择一个.mp4或者.264文件 2. 在码流分析仪软件中打开该文件,从几个层次进行分析 分析SPS和PPS里都包含哪些主要的信息,给出参数值.(例如分辨率.帧率.GOP结构等等) SPS ...

  5. 数据压缩作业:H.264视频格式分析

    目录 一.实验目的 二.实验过程及结果 1.SPS分析 2.PPS分析 3.文件GOP分析 1)编码比特数统计: 2)QP值统计 3)I帧分析 4)B帧分析 5)p帧分析​ 一.实验目的 选择一个.m ...

  6. H.264视频RTP负载格式/NALU的类型

    1. 网络抽象层单元类型(NALU) NALU 头由一个字节组成, 它的语法如下:       +===============+       |0|1|2|3|4|5|6|7|       +=+= ...

  7. H.264码流解析 一个SPS的nalu及获取视频的分辨率

    00 00 00 01 67 42 00 28 E9 00   A0 0B 77 FE 00 02 00 03 C4 80   00 00 03 00 80 00 00 1A 4D 88   10 9 ...

  8. H.264 媒体流 AnnexB 和 AVCC 格式分析 及 FFmpeg 解析mp4的H.264码流方法

    H264码流分两种组织方式,一种是AnnexB格式,一种是AVCC格式. 作者:码农小明 来源:https://blog.csdn.net/shaosunrise/article/details/12 ...

  9. H.264的NALU,RTP封包说明(转自牛人)

    H.264 RTP payload 格式 H.264 视频 RTP 负载格式 1. 网络抽象层单元类型 (NALU) NALU 头由一个字节组成, 它的语法如下: +---------------+ ...

最新文章

  1. java验证码源码_Java通用验证码程序及应用示例(提供源码下载)
  2. python中csv文件操作_python中操作csv文件
  3. 常见问题:内存,循环引用,runloop的简单理解
  4. 阿里平头哥首款CPU芯片发布!5nm倚天710,128核单片600亿晶体管,无人能与争锋...
  5. 求二叉树某个结点的祖先
  6. The differences between capturing and bubbling
  7. 除了收割票房,内战中的中国喜剧电影到底在拼什么?
  8. 如何在DevSecOps道路上快速、安全地抵达终点
  9. CentOS 6.4下操作kdump执行过程
  10. python flask高级编程之restful_python Flask实现restful api service
  11. Java多线程的使用
  12. 整理JavaScript中,数组和字符的操作方法
  13. 来自官方文档的Ubuntu 16.04 + tensorflow-GPU 配置
  14. document.write()
  15. php中如何滚动文字,HTML_网页HTML代码:滚动文字的制作,制作滚动文字 通过本章前面 - phpStudy...
  16. flex eclipse综合spring入门
  17. 投资学U20 期权市场与交易策略 习题解读
  18. 日本作家将编程语言变成了动漫人物,你猜C语言是萝莉还是御姐?不得不说脑洞实在太大了!
  19. 启发函数heuristic 与 A*
  20. 空间分析方法在计算机上的应用,空间分析

热门文章

  1. python中logger_python中的logger
  2. JAVA开发环境配置(详细)
  3. VI下删除文本中的^M
  4. github新手用法详解(建议收藏!!!)
  5. conda显示虚拟环境_conda虚拟环境
  6. mysql 日期能用索引_mysql 日期与索引问题
  7. Best engine and tools for a TA and GAMDEVs
  8. 关于建构主义的一点思考
  9. 搭建一个目录列表程序-H5ai搭建
  10. 在 build.gradle.kts 添加 maven 仓库