H.264压缩标准
零.结构
1.视频结构:
GOP图像组:I内部编码帧,B双向帧,P前向帧
2.I帧(帧内编码图像帧):
I帧可随机访问,本质上是一副图像,压缩比为六分之一
特点:I帧是关键帧/P帧和B帧的参考帧,I帧信息量大质量影响到BP帧质量,从而影响到整个视频质量
压缩方法:基于DCT的压缩技术
编码流程:
1.帧内预测
2.像素值减去预测值得到残差
3.对残差进行变换和量化
4.变长编码和算术编码
5.重构图像并滤波,得到的图像作为参考帧
3.P帧(前向预测编码图像帧):
前向帧,记录与前一帧的差别。解码时使用前一帧和差值来生成最终画面
特点:
1.I帧后的1-2帧
2.预测误差
3.只参考前面最靠近的I/P帧
4.由于P帧作为参考帧的原因,会造成错误扩散
5.P帧压缩比高
压缩方法:基于DCT的压缩技术
编码流程:
P帧的预测和重构:在I帧中找到某点预测值和差值相加得到P帧某点值,恢复P帧
4.B帧(双向参考帧):
压缩时,既参考前向帧,又参考后向帧,采用帧间压缩技术
特点:
1.需要前后帧来进行预测
2.B帧传送的是它与前面的I帧或P帧和后面的P帧之间的预测误差及运动矢量
3.B帧是双向预测编码帧;
4.B帧压缩比最高,因为它只反映两参考帧间运动主体的变化情况,预测比较准确
5.B帧不是参考帧,不会造成解码错误的扩散
压缩方法:基于DCT的压缩技术
编码流程:
接收端根据运动矢量在两个参考帧中“找出(算出)”预测值并与差值求和,得到B帧“某点”样值,从而可得到完整的B帧。采用运动预测的方式进行帧间双向预测编码
为什么需要B帧/和P帧的区别:
B帧压缩比比P帧更高
是否一定要使用B帧?不一定。
在对实时性要求较高的情景,不适用B帧,解码速度更快
5.PTS/DTS:
实际上的解码顺序和播放顺序并不一致
PTS:显示时间戳
DTS:解码时间戳
6.其他术语:
I帧(IDR):立即刷新图像,当解码器解码到IDR图像时,立即将参考帧队列清空,删除缓存的BP帧,开始解码新的序列,在播放中的意义为重新同步,丢弃之前的错误
参考周期(Reference):两个P帧之间的距离
一.技术
1.帧内预测编码
解决了空域数据冗余的问题
2.帧间预测编码
运动估计与补偿,解决了时域数据冗余的问题
时域上的冗余大于空域上的冗余
3.CABAC压缩
无损压缩
二.编解码
三.H264压缩过程
1.原始视频帧(30帧/秒)在H264编码器的缓冲区中,编码器先为每一帧划分宏块(默认宏块大小16*16),划分子块(追求更高的压缩率)
1.1 帧内预测:在划分完宏块后,对每个宏块进行九种模式的预测,找出最合适的预测模式,其中对于16*16的宏块划分,一共存在4种亮度预测模式:
垂直/水平/DC/平面
帧内预测的本质:在宏块中,用最少的信息/最少的亮度值来预测出整个宏块的亮度值。
压缩效果类比图像卷积滤波 类比高斯模糊
1.2 在得到了预测图像后,使用原图减去预测图像的差值得到 “残差值”
保存预测模式和残差值,使得帧内数据大幅减少
在解码时 预测模式信息+残差值 恢复出原图
1.3 对残差值进行DCT离散余弦变换,去掉数据相关性,使得数据进一步被压缩(有损压缩的最后一步)
1.4 CABAC 无损压缩:类似霍夫曼编码
2.帧分组通过宏块扫描和宏块搜索可以得到关联度比较高的一组帧,划分标准:在相邻几幅图像画面中,一般有差别的像素只有10%以内的点,亮度差值变化不超过2%,而色度差值的变化只有1%以内,我们认为这样的图可以分到一组
3.划分帧组后,对于一组帧内,只保留第一帧的完整数据(IDR帧)其他帧为B/P帧
4.运动估计与补偿,计算帧组内物体的运动矢量。H264编码器首先按顺序从缓冲区头部取出两帧视频数据,然后进行宏块扫描。当发现其中一幅图片中有物体时,就在另一幅图的邻近位置(搜索窗口中)进行搜索。如果此时在另一幅图中找到该物体,那么就可以计算出物体的运动矢量了
5.计算完运动矢量后,将相同部分减去,得到补偿数据
四.错误恢复
简书这个对MD太不友好了...