【H264视频编码】一、基本概念
文章目录
- 1、压缩比(约1/100)
- 2、GOP
- 2.1 GOP基本概念
- 2.2 GOP 的关键参数
- 2.2.1 GOP 长度(GOP Size)
- 2.2.2 GOP 结构(GOP Pattern)
- 3、I/P/B帧
- 3.1 I帧(Intra-coded Frame,帧内编码帧)
- 3.1.1 IDR帧:Instantaneous Decoding Refresh
- 3.2 P帧(forword Predicted frame,向前参考帧)
- 3.3 B帧(Bi-directional Frame,双向预测帧)
- 3.4 三者的对比
- 4、SPS与PPS
- 4.1 SPS:(Sequence Parameter Set) 序列参数集
- 4.2 PPS:(Picture Parameter Set) 图像参数集
- 4.3 SPS与PPS的关系
- 5、PTS与DTS
- 5.1 基本概念
- 5.2 为什么需要PTS和DTS?
- 5.3 PTS与DTS的生成与存储
1、压缩比(约1/100)
压缩比受多种因素影响,通常可以达到 20:1 到 100:1 甚至更高,具体取决于编码配置和视频内容。
(1)压缩比范围
-
典型场景:
- 无损压缩:约 2:1(H.264也支持无损模式,但压缩比较低)。
- 有损压缩:
- 普通视频(如影视、会议):50:1 ~ 100:1(例如1080p视频从原始RGB的1.2Gbps压缩到2~10Mbps)。
- 高动态/复杂场景:20:1 ~ 50:1(如体育赛事、快速动作画面)。
- 低动态/简单场景:100:1 以上(如静态幻灯片或动画)。
-
对比原始数据:
- 未压缩的1080p@30fps视频(8-bit YUV 4:2:0)约需(
RGB数据:1920x1080x30x8x3≈1.49Gbps,YUV420数据:1920x1080x30x8x1.5≈746Mbps
) 1.2Gbps,经H.264编码后可降至:- 高质量:5~10 Mbps(压缩比约120:1 ~ 240:1)。
- 流媒体/在线视频:2~5 Mbps(压缩比约240:1 ~ 600:1)。
- 低码率场景:1 Mbps以下(压缩比可达1000:1以上,但画质显著下降)。
- 未压缩的1080p@30fps视频(8-bit YUV 4:2:0)约需(
(2)影响压缩比的关键因素
-
编码配置:
- 帧间预测(Inter-frame):利用时间冗余(如P帧/B帧),大幅提升压缩比。
- 帧内预测(Intra-frame):仅压缩空间冗余(如I帧),压缩比低于帧间预测。
- GOP结构:长GOP(如IPPP)比短GOP(如IBBP)压缩效率更高,但对随机访问不友好。
- 量化参数(QP):QP值越高,压缩比越大,但画质损失更明显。
-
视频内容特性:
- 空间冗余:静态背景(如新闻播报)比复杂纹理(如森林)更易压缩。
- 时间冗余:低运动视频(如讲座)比高运动(如足球赛)压缩比更高。
- 分辨率与帧率:高分辨率视频(如4K)通过下采样可进一步提高压缩效率。
-
编码工具:
- CABAC(熵编码):比CAVLC提升约10%~15%的压缩率。
- 多参考帧与宏块划分:灵活划分(16x16到4x4)优化压缩效率。
(3)与其他编码标准的对比
-
H.264 vs. H.265(HEVC):
H.265在相同画质下可比H.264提升约30%~50%的压缩比,但计算复杂度更高。 -
H.264 vs. VP9/AV1:
AV1在低码率下比H.264提升约30%以上,但兼容性和编码速度较差。
(4)实际应用中的压缩比示例
应用场景 | 原始数据速率 | H.264编码后码率 | 压缩比 |
---|---|---|---|
蓝光视频(1080p) | 1.2 Gbps | 20~40 Mbps | 30:1~60:1 |
YouTube 1080p(高清) | 1.2 Gbps | 4~8 Mbps | 150:1~300:1 |
视频会议(720p) | 0.5 Gbps | 1~2 Mbps | 250:1~500:1 |
监控视频(低运动) | 0.3 Gbps | 0.5~1 Mbps | 300:1~600:1 |
2、GOP
GOP(Group of Pictures,图像组)是视频编码中的一个核心概念,它定义了视频序列中 I帧、P帧、B帧 的排列方式,直接影响压缩效率、随机访问能力和错误恢复能力。
- 实际 GOP 长度因应用程序而异,但通常在 0.5 – 2 秒范围内。
- GOP的排列顺序和参数设置直接影响压缩率与画质平衡,例如IBBPBBP结构通过混合帧类型降低冗余数据。在360度全景视频等场景中,GOP通过分片传输与交织同步技术优化带宽利用率和解码效率
2.1 GOP基本概念
(1)什么是 GOP?
- 定义:GOP 是一组连续的、强相关的视频帧。
- GOP 是视频编码中通过 I/P/B 帧的预测关系实现压缩的基本单元,其结构由 N(长度)、M(B帧密度)、开放/封闭性 共同决定。
- 标准定义(H.264/H.265)
- H.264:
- 默认封闭GOP,可通过 flags +cgop 强制。
- B帧不跨GOP参考。
- H.265:
- 默认开放GOP(open-gop=1),B帧可跨GOP参考。
- 支持 leading pictures 管理跨GOP依赖。
- H.264:
- 作用: 通过帧间预测减少冗余数据,同时平衡 随机访问能力 和 压缩效率。
- 控制压缩效率:通过帧间预测(P/B帧)减少冗余数据。
- 支持随机访问:I帧作为“入口点”,允许解码器从任意 GOP 开始解码。
- 错误恢复:GOP 越短,错误传播范围越小(如直播场景)。
(2)GOP 的典型结构
一个 GOP 通常由以下帧类型组成:
帧类型 | 全称 | 特点 |
---|---|---|
I帧 | Intra-coded | 关键帧,独立编码(帧内编码),不依赖其他帧,占用空间大,但可独立解码 |
P帧 | Predictive | 参考前一帧(I或P帧)进行运动补偿(帧间编码),压缩率比I帧高 |
B帧 | Bi-predictive | 参考前后两帧(I/P帧)(帧间编码),压缩率最高,但解码延迟较大(需缓存前后帧) |
- 示例 GOP 结构(如 IBBPBBPBBPBBPIBBP…):
I → B → B → P → B → B → P → B → B → P → ... → I(下一个GOP)
2.2 GOP 的关键参数
2.2.1 GOP 长度(GOP Size)
- 定义:一个 GOP 中包含的帧数。例如:
- GOP=30:(30帧一个I帧,假设30fps,则每1秒一个I帧)。
- GOP=250:(250帧一个I帧,约8.3秒一个I帧)
- 影响:
GOP 长度 | 优点 | 缺点 | 适用场景 |
---|---|---|---|
短 GOP(如 15~30帧) | 1. 支持快速随机访问 2. 错误恢复快(如直播卡顿后快速恢复) | 1. 压缩率较低 2. I帧频繁,文件稍大 | 直播、视频会议、实时通信 |
长 GOP(如 100~250帧) | 1. 压缩率高(P/B帧占比高) 2. 文件更小 | 1. 随机访问延迟高 2. 错误传播范围大(如丢帧影响后续帧) | 点播(如电影)、存储 |
-
设置方法
FFmpeg:-g 或 -keyint 参数ffmpeg -i input.mp4 -c:v libx264 -g 30 output.mp4 # GOP=30帧
-
更细粒度的 GOP 结构描述方式:用 M 和 N 表示
尤其在 H.264/H.265 编码标准 中常见。以下是详细说明:-
- M 和 N 的定义
参数 名称 含义 示例(假设 N=12, M=3) N GOP 长度 一个完整 GOP 的帧数 N=12:每 12 帧插入一个 I 帧 M I/P 帧间距 两个 参考帧(I 或 P 帧) 之间的间距
(决定 B 帧的数量)M=3:I → B → B → P → B → B → P → … → I -
- 典型 GOP 结构示例
-
案例 1:I+B+P结构,N=12, M=3
每 12 帧(N)一个 GOP,相邻的I/P之间间隔为3(M),即中间间隔(M-1)个B帧。- 帧序列:
I → B → B → P → B → B → P → B → B → P → B → B → I
- 特点:
高压缩率(B 帧多),但解码复杂度高(需缓存参考帧),使用于点播(如电影)。
- 帧序列:
-
案例 2:IPPP结构,N=30, M=1
对于30fs视频,则每秒插入一个I帧。- 帧序列:
I → P → P → P → ... → I
- 特点:
无 B 帧(M=1),适用于低延迟场景(如直播)。
- 帧序列:
-
案例 3:I+B结构,N=30, M=30
- 帧序列:
I → B → B → ... → B → I
- 特点:
仅 I 帧和 B 帧(无 P 帧),极端情况(罕见)。
- 帧序列:
-
案例4:全I帧(Intra-only):
- 帧序列:
I → I → I → ...
- 特点:
无压缩,文件极大,用于视频编辑母带。
- 帧序列:
-
- M 和 N 的参数关系
-
B 帧数量:
- 每两个参考帧(I/P)之间插入 M-1 个 B 帧。
- 例如 M=3 → 每对 I/P 帧间有 2 个 B 帧(I → B → B → P)。
-
P 帧数量:
- 一个 GOP 内 P 帧数 = N/M - 1。
- 例如 N=12, M=3 → 12/3 - 1 = 3 个 P 帧。
-
-
M 和 N 对视频性能的影响
参数组合 压缩效率 解码延迟 随机访问 适用场景 N大,M大 高(B帧多) 高 差 点播(如电影) N小,M小 低 低 好 直播、视频会议 M=1(无B帧) 中等 最低 好 实时通信(如WebRTC)
-
-
- 实际应用建议
-
直播/低延迟:
N=30 ~ 60(1 ~ 2秒),M=1(无 B 帧)。
ffmpeg -g 30 -bf 0 -sc_threshold 0 ... # -g 30:N=30,-bf 0:M=1,-sc_threshold 0:禁用场景切换检测
-
点播/高压缩:
N=120 ~ 250 (4~8秒),M=3(2 B 帧)。
ffmpeg -g 250 -bf 2 -sc_threshold 40 ... # -g 250:N=250,-bf 2:M=3,-sc_threshold 40:值越小:对画面变化的检测越敏感(更容易触发I帧插入),用于控制自动插入I帧
-
视频编辑、医疗影像:N=1(全 I 帧),M=1。
ffmpeg -intra ...
-
- 总结
- N:GOP 总长度(I 帧间隔),影响随机访问和容错。
- M:I/P 帧间距(M-1=B 帧数),影响压缩率和延迟。
- 黄金组合:
- 直播:N=30, M=1(无 B 帧)。
- 点播:N=250, M=3(2 B 帧)。
-
2.2.2 GOP 结构(GOP Pattern)
-
1、闭合 GOP(Closed GOP):(h.264常用)
-
定义:
- B帧仅参考当前GOP内的帧(I/P帧),不跨越GOP边界。
- 每个GOP完全独立解码,解码时无需依赖其他GOP的数据。
- 分界线必须是I帧(或IDR帧),通常以 IDR 帧(Instantaneous Decoding Refresh) 开头,确保解码器可以独立解码该 GOP。
-
闭合GOP示意图:
-
特点:
- 1、闭合GOP在视频流化和压缩中非常有用,它是视频中的独立片段,和其他GOP有清晰的隔断,所有在闭合GOP出现的问题都不会影响到其他GOP。
- 2、兼容性好:所有解码器均支持,适合直播、广播等场景。
- 3、随机访问友好:任意 GOP 均可独立解码,便于视频剪辑和跳转播放。
- 4、错误恢复能力强:若某个 GOP 数据丢失,不影响后续 GOP 的解码。
-
作用:
-
ABR视频流: 在ABR视频流中,播放器可以根据带宽和解码器缓冲器的填充程度在不同配置文件(组合不同码率和分辨率的视频)之间切换。如果播放器要从1080p切换到360p,那么它就需要这种利落的切换。此时IDR发挥作用,这样播放器就能刷新缓冲,让360p的视频流进入。
-
错误恢复: 如果你在流化视频时使用HLS,并且每个视频片段都以IDR开始,这意味着片段中的所有帧都不能参考前、后片段中的帧。所以如果因为某个错误而失去其中一个片段,播放器仍然能继续接收下一个视频片段。有趣的是,Apple 的 HLS 规范提到应该每两秒使用一次 IDR。(注意:规范没有说视频片段持续时间应该是两秒,而是指 GOP 的大小是两秒)。
-
快进快退(Trick Mode): 我们之前提到过,IDR非常有助于实现快进快退。播放器需找到距离最近的IDR,然后开始从这一点播放视频流。
-
-
适用场景:
- H.264/AVC 默认模式(大多数设备兼容)。
- 直播流(如RTMP、HLS):需快速随机访问,避免解码依赖问题。
- 视频编辑:剪辑时GOP边界清晰,避免画面撕裂。
-
-
2、开放 GOP(Open GOP):(H.265/HEVC 常用)
-
定义:
- 分界线可以是B帧或P帧;
- 开放GOP允许B帧跨GOP边界参考前一个GOP的P帧或I帧,以提高压缩效率。
-
开放GOP示意图:
从图中可以看出,GOP#2的B帧向前参考GOP1#的P帧(黄色箭头部分)。 -
技术特征:
- 使用Non-IDR I帧(非即时解码刷新帧),允许后续GOP的B帧参考当前GOP的帧
- 需配合**解码图片缓存(DPB)**管理参考帧
-
优点:
- 更高的压缩率:B 帧能跨 GOP 参考,减少冗余数据。
- 适合点播流媒体:如 Netflix、YouTube,节省带宽。
-
缺点:
- 解码复杂度高:需缓存多个 GOP 的参考帧,增加内存和延迟。
- 兼容性问题:部分旧设备(如蓝光播放器)可能不支持。
-
适用场景:
- H.265/HEVC 编码:默认采用开放GOP,提高压缩效率。
- 点播流媒体(DASH、MPEG-DASH):优化码率分配。
- 高分辨率视频(4K/8K):减少存储和传输成本。
-
开放GOP在以下情况中非常有用:
- 你不需要为了ABR而重新开始一段新的视频,但是需要关闭GOP
- 你现在想要提高视频压缩效率(因为B帧可以多一个高质量的参考帧)
- 当你需要插入I帧时(或是为了刷新视频质量,或者在非场景转换的情况下,是否跨I帧预测并不重要)
-
3、I/P/B帧
3.1 I帧(Intra-coded Frame,帧内编码帧)
-
定义:
I帧是独立编码的帧,不依赖其他帧的信息,仅通过帧内预测(同一帧内的像素块)压缩数据。 -
特点:
- 关键帧,采用帧内压缩技术。
- 自包含:解码时无需参考其他帧,是视频的“关键帧”。
- 压缩率低:因不利用时间冗余,数据量较大。
- 随机访问点:视频播放或拖动时,播放器需先找到I帧才能解码后续帧。
-
应用场景:
- 视频开头必须为I帧。
- 定期插入(如每0.5-2秒一个I帧),确保容错和随机访问。
3.1.1 IDR帧:Instantaneous Decoding Refresh
及时解码刷新。我一般称它为immediate refresh ,立刻刷新,IDR帧必须是一个I帧,但是I帧不一定是IDR帧,这个帧出现的时候,是告诉解码器,可以清除掉所有的参考帧,这是一个全新的序列,新的GOP已经开始。
3.2 P帧(forword Predicted frame,向前参考帧)
-
定义:
P帧通过参考前一帧(I帧或P帧)进行运动补偿预测编码,仅存储与参考帧的差异信息。 -
特点:
- 采用帧间压缩技术
- 前向预测:依赖前一参考帧(I或P帧)进行解码。
- 压缩率中等:利用时间冗余,数据量比I帧小。
- 累积误差:若参考帧丢失或损坏,后续P帧会解码错误。
-
应用场景:
- 连续动态场景中,如运动视频的中间帧。
3.3 B帧(Bi-directional Frame,双向预测帧)
-
定义:
B帧同时参考前后两个参考帧(I帧或P帧)进行双向运动补偿预测,存储前后帧的差异信息。 -
特点:
- 采用帧间压缩技术
- 双向预测:参考前一参考帧和后一参考帧,综合两者信息。
- 压缩率最高:充分利用时间冗余,数据量最小。
- 解码延迟:需先缓存并解码前后参考帧后,才能解码B帧,不适合实时传输。
-
应用场景:
- 对延迟不敏感的场景(如本地存储、流媒体点播)。
3.4 三者的对比
特性 | I帧 | P帧 | B帧 |
---|---|---|---|
依赖关系 | 独立 | 依赖前一参考帧 | 依赖前后两个参考帧 |
压缩率 | 低 | 中等 | 高 |
解码复杂度 | 低 | 中等 | 高(需缓存参考帧) |
容错性 | 高(不依赖其他帧) | 中(依赖前序帧) | 低(依赖前后帧) |
典型用途 | 关键帧、随机访问点 | 连续动态场景 | 高压缩率场景 |
4、SPS与PPS
SPS(Sequence Parameter Set,序列参数集) 和 PPS(Picture Parameter Set,图像参数集) 是关键的元数据单元,用于描述视频序列的全局编码参数和帧级配置。构成视频码流的头部信息,直接影响解码器的初始化和解码过程
4.1 SPS:(Sequence Parameter Set) 序列参数集
-
作用
SPS作用于一串连续的视频图像,包含一个视频序列(如一个GOP或整个视频)的全局编码参数,解码器需要先解析SPS才能正确解码后续帧。 -
关键参数
参数 | 说明 |
---|---|
profile_idc | 编码配置文件(如Baseline、Main、High Profile),决定支持的编码工具。 |
level_idc | 编码等级,限制分辨率、帧率、码率等性能指标。 |
chroma_format_idc | 色度采样格式(如4:2:0、4:2:2) |
pic_width/height | 视频的分辨率(以宏块为单位,需计算实际像素值) |
log2_max_frame_num | 帧序号的最大比特数,影响GOP长度 |
num_ref_frames | 参考帧的最大数量,影响运动补偿的参考范围 |
gaps_in_frame_num_allowed | 是否允许帧序号不连续(用于流式传输) |
帧率相关参数 | 如time_scale和num_units_in_tick,用于计算帧率 |
熵编码模式 | 使用CAVLC(Baseline)还是CABAC(High Profile) |
4.2 PPS:(Picture Parameter Set) 图像参数集
-
作用
PPS包含单帧(或一组帧)的编码参数,通常引用SPS中的配置,但允许帧级灵活调整。 -
关键参数
参数 | 说明 |
---|---|
pps_id | PPS的唯一标识符,SPS通过此ID引用PPS |
sps_id | 关联的SPS ID,指明当前PPS基于哪个SPS |
熵编码模式 | 覆盖SPS中的选择(如CABAC/CAVLC) |
num_slice_groups | 分片组数量(用于并行解码) |
weighted_pred | 是否启用加权预测(用于B/P帧) |
deblocking_filter | 是否启用去块效应滤波器 |
QP调整参数 | 如pic_init_qp(初始量化参数)、chroma_qp_index_offset(色度QP偏移) |
4.3 SPS与PPS的关系
-
1、层级依赖:
- SPS描述全局参数,PPS描述帧级参数,一个SPS可被多个PPS引用。
- 解码器需先加载SPS,再通过PPS中的sps_id关联到对应的SPS。
-
2、存储与传输:
- 在码流中,SPS/PPS通常位于 关键帧(IDR帧)之前(如H.264的NAL单元类型7/8)。
- 在封装格式(如MP4)中,SPS/PPS存储在文件头(avcC/hvcC盒子)。
- 实时传输(如RTP)时需单独发送SPS/PPS,避免丢包导致解码失败。
-
3、动态更新:
- 少数场景下(如分辨率切换),SPS/PPS可能中途更新,但需保证解码器同步。
5、PTS与DTS
PTS(Presentation Time Stamp,显示时间戳) 和 DTS(Decoding Time Stamp,解码时间戳) 是用于同步视频播放和解码顺序的关键时间参数。
5.1 基本概念
-
1、DTS(Decoding Time Stamp)
-
定义:
表示视频帧 何时需要被解码。解码器
必须按照DTS顺序处理帧数据,否则依赖关系会破坏(例如P帧需要先解码其参考帧)。 -
核心作用:
确保帧间预测(如P帧依赖I帧,B帧依赖前后帧)的正确性。
-
-
2、PTS(Presentation Time Stamp)
-
定义:
表示视频帧 何时需要被显示。播放器
根据PTS顺序渲染帧,保证视频流畅。 -
核心作用:
解决因B帧导致解码顺序与显示顺序不一致的问题。
5.2 为什么需要PTS和DTS?
-
B帧引入的时序问题
- B帧的双向预测特性:
B帧需要参考前后的参考帧(如P帧或I帧),导致解码顺序和显示顺序不同。
示例:GOP结构如下
I-B-B-P-B-B-P
显示顺序(PTS)
I(0) B(1) B(2) P(3) B(4) B(5) P(6)
解码顺序(DTS)
(解码器需先解码P帧,才能解码依赖它的B帧)I(0) P(3) B(1) B(2) P(6) B(4) B(5)
- B帧的双向预测特性:
-
无B帧时:
若视频无B帧(如仅I/P帧),PTS和DTS通常相同。
5.3 PTS与DTS的生成与存储
(1) 编码器侧
- 编码器在压缩视频时:
- 按 显示顺序(PTS) 接收原始帧(如 I→B→B→P→B→B→P)。
- 根据帧间依赖关系重排为 解码顺序(DTS)(如 I→P→B→B→P→B→B)。
- 为每一帧写入PTS和DTS(通常存储在容器格式如MP4、TS的头部)。
(2) 封装格式中的存储
-
MP4:
PTS/DTS存储在mdat盒子的Sample Table中,通过stts(时间戳表)、ctts(PTS偏移表)等字段描述。 -
TS流(MPEG-TS):
通过PES包的头部字段携带PTS/DTS。
(3) 解码器侧
- 解码器按DTS顺序解码帧。
- 解码完成后,根据PTS将帧放入显示缓冲区,等待渲染。