目录
前言
一 什么是H264/H265?
H.264 (MPEG-4 AVC)
H.265 (HEVC)
二 为什么要学习H264和H265?
1. 深入理解视频压缩原理
2. 硬件优化与集成
3. 调试与故障排除
4. 持续的技术更新
三 NAL(Network Abstraction Layer)详解
1. 为什么要学NALU呢?
2 那么一个NALU单元里面的构造有是什么样的呢?
3. type低5位代表怎么什么呢?
4. 一些经常见的Type字段
四 264中裸流IPB帧如何分布
1 什么是GOP
前言
在开始学习H264/H265之前,我们要先了解一些和视频相关的专业名词
- Level(级别)指定视频编码的最大能力,如最大分辨率、最大帧率等。
- NAL Unit(网络抽象层单元)视频编码流中的最小可访问单元,用于传输和解码。
- Slice(片)视频帧的一部分,可以独立解码,用于错误恢复和并行处理。
- Macroblock(宏块)编码的基本单元,通常为16x16像素的块,用于运动估计和预测。
- Intra Frame(I帧)不依赖其他帧进行解码的帧,通常用于随机访问点。
- Predictive Frame(P帧)可以向前参考一个或多个I帧或P帧进行解码。
- Bidirectional Frame(B帧)可以前向和后向参考进行解码,提供更高的压缩效率。
- SPS(Sequence Parameter Set)包含序列级别的参数,如画面尺寸、帧率等。
- PPS(Picture Parameter Set)包含图像级别的参数,如量化参数、熵编码模式等。
- SEI(Supplemental Enhancement Information)提供额外的信息,如时间戳、摄像机运动数据等。
- GOP(Group of Pictures)一系列连续的帧,通常包含一个I帧和随后的P帧或B帧。
一 什么是H264/H265?
H.264 (MPEG-4 AVC)
H.264,全称MPEG-4 Part 10或Advanced Video Coding (AVC),是由ITU-T的视频编码专家组(VCEG)和ISO/IEC的动态图像专家组(MPEG)联合开发的一种视频编码标准。H.264的主要目标是在与早期标准(如MPEG-2和MPEG-4 Part 2)相同的视频质量下,提供大约两倍的压缩效率。这意味着使用H.264编码的视频文件可以比使用旧标准编码的文件小一半左右,这对于网络传输和存储来说非常重要。
H.264通过多种技术实现高效压缩,包括:
- 块运动补偿预测
- 变换编码
- 熵编码(如CABAC或CAVLC)
H.265 (HEVC)
H.265,又称为High Efficiency Video Coding (HEVC),是H.264的后继者,同样由VCEG和MPEG联合开发。H.265的目标是在H.264的基础上进一步提高压缩效率,理论上可以比H.264节省大约50%的比特率,同时保持相同的视频质量。
H.265相对于H.264的主要改进包括:
- 更大的编码单元(CU)尺寸,从64×64到8×8像素的自适应四叉树结构。
- 改进的运动预测和帧内预测技术。
- 更高效的熵编码方法。
- 更精细的量化参数控制。
这些改进使得H.265在处理高清和超高清视频时更加高效,但同时也意味着更高的计算复杂度,这可能影响到实时编码和解码的性能。
由于H.265的高效性,它在高清和4K视频的流媒体和存储领域变得越来越重要
小结:H264/H265都是视频压缩标准,265会比264更先进,安防领域,为了兼容性,一般也会保留264一起使用
二 为什么要学习H264和H265?
如果是安防领域的嵌入式软件工程师,不说能精通264,265这两编码格式,但起码要有一点的了解,这样在程序出问题后能更快的定位问题,解决问题
1. 深入理解视频压缩原理
- 理论基础:了解H.264和H.265的编码框架、算法原理和关键技术,如帧内预测、帧间预测、变换编码、熵编码等,有助于开发人员从底层理解视频压缩的过程和机制。
- 优化策略:掌握这些原理可以指导开发人员如何根据不同的应用场景和硬件限制选择最优的编码参数和策略,比如在实时监控中如何平衡压缩效率与延迟。
2. 硬件优化与集成
- 硬件加速:许多现代嵌入式处理器集成了专门的硬件模块来加速H.264和H.265的编码和解码,了解这些标准有助于开发人员充分利用硬件加速功能,提高视频处理效率,减少CPU负载和功耗。
- 软件优化:对于没有硬件加速的场景,开发人员可以通过优化软件编码库(如FFmpeg)的使用,来提高编码速度和效率。
3. 调试与故障排除
- 错误定位:当视频流出现质量问题或系统性能不佳时,对H.264和H.265的理解有助于开发人员快速定位问题所在,比如是否是编码参数设置不当、硬件资源不足或是网络瓶颈造成的。
- 性能调优:基于对标准的深入了解,开发人员可以进行更细致的性能调优,比如调整量化参数、编码速率控制策略等,以达到最佳的视频质量和系统性能平衡。
4. 持续的技术更新
- 技术演进:随着视频监控技术的发展,新的编码标准(如H.266/VVC)和相关技术不断涌现,深入理解H.264和H.265为基础,可以帮助开发人员更容易地过渡到新技术,保持系统的先进性和竞争力。
三 NAL(Network Abstraction Layer)详解
1. 为什么要学NALU呢?
我看下面的264的裸流结构,起始H264就是一个起始码+一个NALU单元这样接替,所以想要更清楚了解到H264的裸流,我们必须要去了解NALU了
2 那么一个NALU单元里面的构造有是什么样的呢?
NAL单元(NAL Unit)是NAL层的基本数据单位,由一个头部(一个字节)和一个负载部分组成:
1.头部:包含了控制信息,用于指示NAL单元的类型、重要性等级以及其他相关参数。头部结构如下:
2.负载:包含了实际的编码数据,如图像数据、参数集数据等。负载数据的结构和内容取决于NAL单元的类型。
3. type低5位代表怎么什么呢?
Type:5位的类型指示,用于标识NALU的类型。
Type字段的低5位编码了以下NALU类型:
0:未指定
1:非IDR图片的编码切片(Coded slice of a non-IDR picture)
2:编码切片数据分区A(Coded slice data partition A)
3:编码切片数据分区B(Coded slice data partition B)
4:编码切片数据分区C(Coded slice data partition C)
5:IDR图片的编码切片(Coded slice of an IDR picture)
6:补充增强信息(Supplemental Enhancement Information, SEI)
7:序列参数集(Sequence Parameter Set, SPS)
8:图像参数集(Picture Parameter Set, PPS)
9:访问单元分隔符(Access unit delimiter)
10:序列结束(End of sequence)
11:流结束(End of stream)
12:填充数据(Filler data)
13:序列参数集扩展(Sequence parameter set extension)
14:前缀NAL单元(Prefix NAL unit)
15:子集序列参数集(Subset sequence parameter set)
16-23:保留用于扩展
通过解读Type字段,解码器能够知道接收到的NALU是否是视频数据的一部分、是序列参数集还是图像参数集,或者是其他类型的NALU,从而正确地处理和解码数据。
4. 一些经常见的Type字段
67 :SPS
68 :PPS
65 :IDR帧
61 :I/P/B帧
如何解析type类型
例1:0x67 0110 0111
这个为序列参数集,即SPS
但是要注意,这个不代表只有0x67才是SPS
比如0x27,0010 0111,这个也代表SPS,高三位代表着数据的主要性
低五位才是NAL的类型
例2 : 61并非确定某帧,而是I/P/B都可能,如果需要进一步确定,需要在进一步分析,这个后面再说
四 264中裸流IPB帧如何分布
下图就是正常裸流中IPB帧的关系,两个I帧的间距称为GOP,不过一般在安防领域不会有B帧,具体情况可以看这篇博客
在这个结构中:
- I帧:是自包含的,不依赖于其他帧进行解码。它使用帧内预测技术进行编码,通常占用的比特数较多,但可以作为随机访问点,即解码器可以从I帧开始解码,而无需考虑之前的帧。
- P帧:使用前向预测技术,依赖于前面的一个I帧或P帧进行解码。P帧的编码效率高于I帧,因为它利用了时间冗余。
- B帧:使用双向预测技术,既可以从前一个P帧或I帧预测,也可以从后一个P帧预测,或者两者结合。B帧通常占用的比特数最少,但需要前后两个参考帧,因此在解码时必须等待所有参考帧到位。
1 什么是GOP
GOP的大小(即GOP中帧的数量)可以根据应用场景和编码策略进行调整。较小的GOP(例如,每12帧有一个I帧)可以提供更好的随机访问性能,但压缩效率较低,因为I帧占用的比特数较多。较大的GOP(例如,每60帧有一个I帧)可以提高压缩效率,但随机访问性能较差,因为解码器需要解码整个GOP才能找到下一个I帧。
分布策略
编码器通常会根据以下因素来决定I、P、B帧的分布:
- 码率控制:为了维持平均比特率,编码器可能会在复杂场景中增加I帧和P帧的比例,而在简单场景中增加B帧的比例。
- 随机访问需求:如果视频流需要支持随机跳转,编码器会增加I帧的频率。
- 延迟要求:在实时应用中,减少B帧的数量可以降低解码延迟,因为B帧需要等待后续的P帧才能解码,所以IPC的裸流数据一般不含B帧,因为对实时性比较高
后面预计还会有几篇博客
1 代码实现解析SPS和PPS,读取文件帧率,宽高度,GOP,IPB帧
2 安防领域中为啥很少使用B帧,甚至不使用
3 下暴雨,或者画面变化过快,视频码率飙升,如何解决