一、前言:
H.264,也称为 AVC(Advanced Video Coding),是一种广泛应用的视频编码标准,由国际电信联盟(ITU-T)和国际标准化组织(ISO/IEC)联合制定。H.264 是一种高效的视频压缩标准,提供了出色的视频质量和压缩性能,适用于广泛的应用领域,包括广播、视频会议、视频流媒体和存储等。
二、Profile和Level:
2.1、Profile (配置)
Profile:这是编码器设置的一种配置,定义了压缩视频所需的工具和功能。主要的Profiles包括:
- baseline:支持快速编码/解码,以适应低复杂度环境,适用于视频会议及移动应用。
- main:提供更高的压缩性能和更复杂的工具,适用于广播和存储。
- high:用于高清(HD)视频,支持更复杂的压缩技术,常用于DVD和蓝光等。
2.2、Level (级别)
Level
定义了 H.264 编码器的性能限制,比如最大分辨率、最大码率、最大帧率等。Level 的数值越高,支持的分辨率、码率等越高。
常见的 Level 示例:
- Level 1.0: 最大分辨率 176×144(QCIF),最大码率 64 kbps。
- Level 3.1: 最大分辨率 1280×720(720P),最大码率 14 Mbps。
- Level 4.1: 最大分辨率 1920×1080(1080P),最大码率 50 Mbps。
- Level 5.2: 最大分辨率 4096×2304,最大码率 240 Mbps。
2.3、对应关系:
Level | Max macroblocks | Max video bit rate (kbit/s) | Examples for high resolution @ frame rate (max stored frames) | ||||
---|---|---|---|---|---|---|---|
per second | per frame | BP, XP, MP | HiP | Hi10P | Hi422P, Hi444PP | ||
1 | 1,485 | 99 | 64 | 80 | 192 | 256 | 128×96@30.9 (8) 176×144@15.0 (4) |
1b | 1,485 | 99 | 128 | 160 | 384 | 512 | 128×96@30.9 (8) 176×144@15.0 (4) |
1.1 | 3,000 | 396 | 192 | 240 | 576 | 768 | 176×144@30.3 (9) 320×240@10.0 (3) 352×288@7.5 (2) |
1.2 | 6,000 | 396 | 384 | 480 | 1,152 | 1,536 | 320×240@20.0 (7) 352×288@15.2 (6) |
1.3 | 11,880 | 396 | 768 | 960 | 2,304 | 3,072 | 320×240@36.0 (7) 352×288@30.0 (6) |
2 | 11,880 | 396 | 2,000 | 2,500 | 6,000 | 8,000 | 320×240@36.0 (7) 352×288@30.0 (6) |
2.1 | 19,800 | 792 | 4,000 | 5,000 | 12,000 | 16,000 | 352×480@30.0 (7) 352×576@25.0 (6) |
2.2 | 20,250 | 1,620 | 4,000 | 5,000 | 12,000 | 16,000 | 352×480@30.7(10) 352×576@25.6 (7) 720×480@15.0 (6) 720×576@12.5 (5) |
3 | 40,500 | 1,620 | 10,000 | 12,500 | 30,000 | 40,000 | 352×480@61.4 (12) 352×576@51.1 (10) 720×480@30.0 (6) 720×576@25.0 (5) |
3.1 | 108,000 | 3,600 | 14,000 | 17,500 | 42,000 | 56,000 | 720×480@80.0 (13) 720×576@66.7 (11) 1280×720@30.0 (5) |
3.2 | 216,000 | 5,120 | 20,000 | 25,000 | 60,000 | 80,000 | 1,280×720@60.0 (5) 1,280×1,024@42.2 (4) |
4 | 245,760 | 8,192 | 20,000 | 25,000 | 60,000 | 80,000 | 1,280×720@68.3 (9) 1,920×1,080@30.1 (4) 2,048×1,024@30.0 (4) |
4.1 | 245,760 | 8,192 | 50,000 | 62,500 | 150,000 | 200,000 | 1,280×720@68.3 (9) 1,920×1,080@30.1 (4) 2,048×1,024@30.0 (4) |
4.2 | 522,240 | 8,704 | 50,000 | 62,500 | 150,000 | 200,000 | 1,920×1,080@64.0 (4) 2,048×1,080@60.0 (4) |
5 | 589,824 | 22,080 | 135,000 | 168,750 | 405,000 | 540,000 | 1,920×1,080@72.3 (13) 2,048×1,024@72.0 (13) 2,048×1,080@67.8 (12) 2,560×1,920@30.7 (5) 3,680×1,536@26.7 (5) |
5.1 | 983,040 | 36,864 | 240,000 | 300,000 | 720,000 | 960,000 | 1,920×1,080@120.5 (16) 4,096×2,048@30.0 (5) 4,096×2,304@26.7 (5) |
Level:级别。
Max macroblocks:最大宏块数。注:宏块尺寸是16x16的。
per second:每秒(的最大宏块数)。可用于约束帧率。
per frame:每帧(的最大宏块数)。可用于约束分辨率。
Max video bit rate (kbit/s):最大视频码率。不同档次(Profile)下会有区别。
BP:Baseline Profile,基线档次。
XP:Extended Profile,进阶档次。
MP:Main Profile,主要档次。
HiP:High Profile,高级档次。
Hi10P:High 10 Profile,高级10位档次。
Hi422P:High 4:2:2 Profile,高级4:2:2档次。
Hi444PP:High 4:4:4 Predictive Profile,高级4:4:4(实验性?)档次。
Examples for high resolution @ frame rate (max stored frames):范例:高分辨率@帧率(最大存储帧数)。
三、SPS和PPS:
在 H.264 中,PPS(Picture Parameter Set) 和 SPS(Sequence Parameter Set) 是用于描述视频流的元信息,一般是第一个NALU,它们在解码器中起着重要作用。
3.1、SPS(序列参数集)
- 描述一段视频流的全局编码参数。
- 包括:
- 视频的分辨率(宽高)。
- 帧率。
- 最大参考帧数。
- 显示帧序号。
- 编码器的 Profile 和 Level。
3.2、PPS(图像参数集)
- 描述单张(或几张)图像帧的参数。
- 包括:
- 帧类型。
- 熵编码模式(CABAC 或 CAVLC)。
- 去块滤波器参数。
- 帧内预测模式。
- GOP中解码帧序号。
关系:
- SPS 是视频流级别的全局配置参数,而 PPS 是图像级别的局部配置参数。
- SPS 和 PPS 存储在编码视频帧的头部,解码器需要先解析它们,才能正确解码后续视频帧。
四、I帧、B帧、P帧:
- I帧(Intra-coded Frame):完整帧,是一种自包含的图像,编码时不依赖其他帧。用于快速恢复图像质量,通常是关键帧。
- P帧(Predictive-coded Frame):使用前面的I帧或P帧作为参考,存储了相对于参考帧的差异,通常比I帧占用更小的空间。
- B帧(Bi-directional Predictive-coded Frame):既可以参考前面的I帧或P帧,也可以参考后面的帧,通常提供最高的压缩效率,但延迟大。
五、YUV420\YUV422\YUV444:
可以参考这一篇,写得非常好,我不再重复造轮子:https://blog.youkuaiyun.com/qq_41468222/article/details/111031135
但是,记住,我们最常用的是YUV420P,单帧占用空间=长宽1.5 字节。
六、GOP、帧率、码率:
6.1、定义:
- GOP(Group of Pictures):
- GOP是视频编码中的一个单位,由一组视频帧组成。通常包括一个I帧(关键帧),后面跟随多个P帧和B帧。GOP的长度(即帧的数量)和结构(I帧、P帧和B帧的排列组合)会影响编码的效率和视频的质量。
- 码率(Bitrate):
- 码率指视频在单位时间内传输的数据量,通常以kbps(千比特每秒)或Mbps(兆比特每秒)来表示。码率越高,视频质量通常越好,但所需的带宽也越大。
- 帧率(Frame Rate):
- 帧率是指每秒播放的帧数,通常以fps(frames per second)表示。常见的帧率有24fps(电影)、30fps(网络视频)、60fps(高清视频)等。帧率影响了视频的流畅度和播放体验。
6.2、关系
- GOP结构与码率:
- GOP的结构(即I帧、P帧和B帧的数量及顺序)直接影响视频的编码效率和码率。例如:
- 较长的GOP(更多的P帧和B帧)可以在一定程度上降低码率,因为P帧和B帧相对于I帧存储的是差异数据,减少了信息量。
- 但是,如果GOP长度过长,可能会导致视频的访问延迟和错误传播问题。
- GOP的结构(即I帧、P帧和B帧的数量及顺序)直接影响视频的编码效率和码率。例如:
- 帧率与码率:
- 较高的帧率通常会导致较高的码率,因为每秒处理的帧越多,所需传输的数据量越大。为了保持相同的画质,较高的帧率需要更高的码率。
- GOP长度、帧率和码率的综合影响:
- 整体码率:对于给定的帧率和GOP长度,可以通过调整I帧和P/B帧的比例来控制码率。当I帧比重增加时,码率通常会上升,因为I帧需要完整的画面数据。
- 实时应用:在实时视频应用中,较短的GOP和较高的帧率有助于减少延迟,但可能需要更高的码率来维持视频质量。
- 视频流媒体:对于流媒体,选择合适的GOP长度和码率可以确保在不同网络条件下流畅播放,使其在带宽有限的情况下能够接受。
6.3、经验值:
他们几个之间如何匹配,声望总结的很好:
https://docportal.shengwang.cn/cn/video-legacy/video_profile_apple?platform=iOS
七、宏块:
宏块(Macroblock)是H.264视频编码标准中的基本处理单元,用于图像压缩和编码。无论是帧内压缩,或者帧间压缩,都是以宏块为单位。
7.1、概念
- 宏块是指在视频编码过程中定义的一个固定大小的图像区域,通常为16x16像素。它是H.264编码和压缩的基本单元,帮助编码器高效地分析和处理视频帧。
7.2、结构
一个宏块通常由以下几个部分组成:
- 亮度分量(Y):在YUV色彩空间中,宏块的亮度分量通常占用16x16像素。
- 色度分量(U和V):H.264采用4:2:0色彩采样,即每个宏块会包含一个16x16像素的亮度分量和两个相应的色度分量,U和V的尺寸为8x8像素。这意味着色度信息的分辨率较低,减少了数据量并提高了编码效率。
7.3、功能
- 运动补偿:宏块支持运动补偿和预测编码。通过参考之前已编码的帧中的宏块,可以降低当前宏块编码所需的数据量。这种方法通过存储运动矢量(表示宏块如何在帧间移动)来预测当前帧的宏块。
- 块别编码:H.264能够将宏块进一步细分为更小的块(如8x8或4x4),以更精细地进行编码。这种灵活性使得编码器可以有效地适应不同的内容和细节水平,优化压缩性能。
- 变换和量化:在宏块内,首先会对块进行离散余弦变换(DCT),然后进行量化处理,以减少频率成分的细节,使得数据更容易压缩存储。
7.4、重要性
- 编码效率:宏块是H.264中实现高效视频编码的关键单元。通过对宏块的运动估计和低频信号的编码,H.264能够在保持较好图像质量的同时显著降低比特率。
- 错误传播与恢复:宏块的使用还帮助确定视频流中的错误传播。例如,当某个宏块的编码失败时,视频流的其他部分仍然可以正常显示,这有助于提高整个流的可靠性。
- 复杂度和灵活性:H.264能够根据编码内容的复杂度灵活配置宏块的大小和处理方式,适用于多种应用场景,包括网络视频传输、存储和实时编码等。