6.1.2、源码简单浏览

6.1.3、重点1:h.264帧结构
6.1.4、重点2:帧结构分析软件的使用
6.1.5、重点3:rtsp网络编程
6.1.6、重点4:wireshark网络抓包工具的使用

6.2.H264编码原理和基本概念
6.2.1、h.264编码原理
(1)图像冗余信息:空间冗余、时间冗余
(2)视频编码关键点:压缩比、算法复杂度、还原度
(3)H.264的2大组成部分:视频编码层VCL和网络抽象层面NAL Network Abstract Layer,
6.2.2、h.264编码相关的一些概念
(1)宏块 MB macroblock
(2)片 slice
(3)帧 frame
(4)I帧、B帧、P帧

I帧:起始帧,不参考其它帧

B帧:参考前后帧

P帧:参考前帧

(5)帧率 fps
(6)像素->宏块->片->帧->序列->码流

6.3.H264的NAL单元详解1
6.3.1、VCL和NAL的关系
(1)VCL只关心编码部分,重点在于编码算法以及在特定硬件平台的实现,VCL输出的是编码后的纯视频流信息,没有任何冗余头信息
(2)NAL关心的是VCL的输出纯视频流如何被表达和封包以利于网络传输
(3)SODB:String Of Data Bits
(4)RBSP:Raw Byte Sequence Payload
(5)NALU:Network Abstraction Layer Units
(6)关系:
SODB + RBSP trailing bits = RBSP
NAL header(1 byte) + RBSP = NALU

 H264码流结构
1. H264分层结构
H.264的功能分为两层,视频编码层(VCL)和网络提取层(NAL)VCL数据即被压缩编码后的视频数据序列。在VCL数据要封装到NAL单元中之后,才可以用来传输或存储。
NAL单元格式表1所示:
表1 NAL单元格式
    NAL头RBSPNAL头RBSP
RBSP:封装于网络抽象单元的数据称之为原始字节序列载荷RBSP,它是NAL的基本传输单元。其中,RBSP又分为视频编码数据和控制数据。其基本结构是:在原始编码数据的后面填加了结尾比特。一个bit“1”若干比特“0”,以便字节对齐。
RBSP的类型: 
RBSP 类型之一 PS: 包括序列参数集 SPS  和 图像参数集 PPS 
        SPS 包含的是针对一连续编码视频序列的参数,如标识符 seq_parameter_set_id、帧数及 POC 的约束、参考帧数目、解码图像尺寸和帧场编码模式选择标识等等。 
        PPS对应的是一个序列中某一幅图像或者某几幅图像,其参数如标识符 pic_parameter_set_id、可选的 seq_parameter_set_id、熵编码模式选择标识、片组数目、初始量化参数和去方块滤波系数调整标识等等。 

(7)总结:做编码器的人关心的是VCL部分;做视频传输和解码播放的人关心的是NAL部分
6.3.2、H.264视频流分析工具
(1)雷神作品:SpecialVH264.exe
(2)国外工具:Elecard StreamEye Tools
(3)二进制工具:winhex
(4)网络抓包工具:wireshark
(5)播放器:vlc
6.3.3、h264视频流总体分析
(1)h264标准有多个版本,可能会有差异,具体差异不详
(2)网上看的资料有时讲法会有冲突,或者无法验证的差异
(3)我们的课程都是以海思平台为主、为准、为案例,不能保证其他平台也完全一样
(4)海思平台编码出来的H.264码流都是一个序列包含:1sps+1pps+1sei+1I帧+若干p帧

6.4.H264的NAL单元详解2
6.4.1、相关概念
(1)序列 sequence
(2)分隔符
(3)sps
(4)pps
(5)sei
(6)NALU
6.4.2、NALU详解
https://blog.csdn.net/jefry_xdz/article/details/8461343

6.5_6.H264的NAL单元详解3_4
6.5.1、sps和pps详解
https://www.cnblogs.com/wainiwann/p/7477794.html
6.5.2、H264的profile和level
https://blog.csdn.net/xiaojun111111/article/details/52090185
6.5.3、sequence
(1)一段h.264的码流其实就是多个sequence组成的
(2)每个sequence均有固定结构:1sps+1pps+1sei+1I帧+若干p帧
(3)sps和pps和sei描述该sequence的图像信息,这些信息有利于网络传输或解码
(4)I帧是关键,丢了I帧整个sequence就废了,每个sequence有且只有1个I帧
(5)p帧的个数等于fps-1
(6)I帧越大则P帧可以越小,反之I帧越小则P帧会越大
(7)I帧的大小取决于图像本身内容,和压缩算法的空间压缩部分
(8)P帧的大小取决于图像变化的剧烈程度
(9)CBR和VBR下P帧的大小策略会不同,CBR时P帧大小基本恒定,VBR时变化会比较剧烈

2 SPS PPS详解

2.1 SPS语法元素及其含义

在H.264标准协议中规定了多种不同的NAL Unit类型,其中类型7表示该NAL Unit内保存的数据为Sequence Paramater Set。在H.264的各种语法元素中,SPS中的信息至关重要。如果其中的数据丢失或出现错误,那么解码过程很可能会失败。SPS及后续将要讲述的图像参数集PPS在某些平台的视频处理框架(比如iOS的VideoToolBox等)还通常作为解码器实例的初始化信息使用。

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

  • 解码器需要在码流中间开始解码;
  • 编码器在编码的过程中改变了码流的参数(如图像分辨率等);

在做视频播放器时,为了让后续的解码过程可以使用SPS中包含的参数,必须对其中的数据进行解析。其中H.264标准协议中规定的SPS格式位于文档的7.3.2.1.1部分,如下图所示:

05-08 14:56