参考链接:(松下制作的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帧解码时依赖后面的帧,这就导致后面帧的解码时间和显p示时间不一样)。

从一个I帧到下一个I帧之前的所有图像构成一个GOP(Group of Pictures),在这个GOP内部的图像解码不依赖其他GOP的帧。如果GOP的第一帧一定是I帧,如果这个I帧丢失,那么这整个GOP内的图像都会解码失败,造成画面卡顿。

除了I帧,H264帧还有IDR帧的概念。IDR帧表示解码器立即刷新(Instantaneous Decoder Refresh),解码器收到IDR帧后,会立即清空缓存,将积压的未解码的P帧和B帧全部清除,重新开始新一轮GOP的解码。

关于I帧和IDR帧的区别:// TODO

 IIDR帧都是使用帧内预测的,它们都是同一个东西而已。在编码和解码中为了方便,要将首个I帧和其他I帧区别开,所以才把第一个I帧叫IDR,这样就方便控制编码和解码流程。IDR帧的作用是立刻刷新,使错误不致传播,从IDR帧开始,重新算一个新的序列开始编码。而I帧不具有随机访问的能力,这个功能是由IDR承担,IDR会导致DPB(参考帧列表——这是关键所在)清空,而I不会。IDR图像一定是I图像,但I图像不一定是IDR图像。一个序列中可以有很多的I图像,I图像之后的图像可以引用I图像之间的图像做运动参考。

对于IDR帧来说,在IDR帧之后的所有帧都不能引用任何IDR帧之前的帧的内容,与此相反,对于普通的I-帧来说,位于其之后的B-P-帧可以引用位于普通I-帧之前的I-帧。从随机存取的视频流中,播放器永远可以从一个IDR帧播放,因为在它之后没有任何帧引用之前的帧。但是,不能在一个没有IDR帧的视频中从任意点开始播放,因为后面的帧总是会引用前面的帧。


slice

先把图像分成片,再把片分成宏块,引入片的目的是为了防止误码扩散和传输(一个片预测不能以其他片中的宏块为参考图像),也为了实现并行编码,因为片的编码是独立的,片之间相互独立编码。

主要是为了并行编码设计,把一帧图像分成几个片,片之间相互独立编码。

宏块

h264中编码的基本单元是宏块,一个slice包含多个宏块。一帧图像的结构如下:

帧内压缩

帧间压缩

熵编码

关于QP值

关于Profile和Level









  • 无标签