参考链接:(松下制作的H.264编码技术动画)H.264 Compression Technology_哔哩哔哩_bilibili
相关概念
I/P/B帧
H264定义的三种视频帧类型。
- I帧(Intra-frame):也称关键帧,采用帧内压缩技术,解码时不依赖其他的帧。I帧用于给后续的P帧和B帧提预测参考,一般视频的第一帧就是I帧。
- P帧(Predicted-frame):预测帧,或叫前向预测帧,记录与前一个I帧或P帧的差别,解码时需要依赖前一个帧。(P帧没有完整的画面数据,只有与前一帧的差别)
- B帧(Bi-directional frame):双向参考帧,记录与前后的I帧或P帧的差别,解码时需要参考前后两个帧。(B帧解码时依赖后面的帧,这就导致后面的帧要先解码,解码时间和显示时间不一样)。
相邻两个I帧构成一个GOP(Group of Pictures)。GOP是从MPEG-1开始就有的概念,一般来说一个GOP内部的图像解码不依赖其他的GOP,并且GOP的第一帧一定是I帧,如果这个I帧丢失,那么这整个GOP内的图像都会解码失败,造成画面卡顿(如果只是P帧或B帧丢了,那么一般是画面花屏)。
除了I帧,H264帧还有IDR帧的概念。IDR帧表示解码器立即刷新(Instantaneous Decoder Refresh),IDR帧都是I帧,解码器收到IDR帧后,会立即清空缓存,将积压的未解码的P帧和B帧全部清除,重新开始新一轮GOP的解码。IDR帧后面的帧解码时绝对不会依赖IDR前面的帧。(作为对比,H264中的P帧B帧有可能依赖上一个普通I帧之前的帧)
片和宏块
H264编码的基本单位是宏块,所有关于帧内预测、运动矢量、运动补偿、离散余弦变换和量化的操作都是针对宏块的,但H264并不会一次对一整幅图像进行宏块划分和编码,而是会先将图像拆分成若干个片(Slice),再对片进行编码和输出。片是比帧小、但比宏块大的单位,一帧图像可以拆分成一个或若干个片,每个片包含至少一个宏块。
宏块划分
h264中编码的基本单元是宏块,一个slice包含多个宏块。一帧图像的结构如下:
帧内压缩
帧间压缩
熵编码
关于QP值
关于Profile和Level