H264的压缩比为1%
在格式为YUV420的情况下,分辨率为640x480,帧率为15,每秒传输640x480x15x1.5x8 = 55296000 bit = 55.296 Mbps,因此至少需要55Mb/s。但是H264的建议码流为500kpbs,因此可见H264的压缩率为1%
GOP(Group Of Pictures)
将视频帧的相关性进行分组,比如一个GOP里面将一些变化不是很大的帧放在一块,GOP内帧与帧差别很小,这样就能利用一些算法,进行编码,把这些帧压缩的很小,把变化的部分作为保留,在GOP中,未变化的部分,进行一次存储,这样就能极大的减少存储空间。在GOP中,存在3种帧,下面介绍这3种帧。
I帧(intraframe frame)
关键帧,采用帧内压缩技术。IDR帧属于I帧。视频中最关键的一些帧,这些帧缺失了,视频将无法播放。GOP中的第一帧一般是IDR帧。但是I帧并不一定是IDR帧。
P帧(forward Predicted frame)
向前参考帧。压缩时,只参考前面已经处理的帧,采用帧间压缩技术。它占I帧的一半大小
B帧(Bidirectionally predicted frame)
双向参考帧。压缩时,既参考前面已经处理的帧,也参考后面的帧,帧间压缩技术。它
占I帧1/4 大小
IDR帧和I帧的区别和联系
- IDR(Instantaneous Decoder Refresh) 解码器立即刷新。这个帧来了以后,缓冲区的数据清空,因为该帧为关键帧,不需要依赖其他的帧。
- 每当遇到IDR帧时,解码器就会清空解码器参考buffer中的内容
- 每个GOP中的第一-帧就是IDR帧
- IDR帧是一种特殊的I帧
帧与分组的关系
I帧被B帧和P帧参考,B帧之间不能互相参考,B帧可以参考I帧和P帧,P帧参考I帧,后面的P帧参考前面的P帧。先解码I帧,然后解码P帧,最后解码B帧。播放时,按顺序播放即可。
SPS (Sequence Parameter Set)
序列参数集,作用于一-串连续的视频图像。 如
seq_ parameter_ set_ id、帧数及POC(picture order count)的约束、参考帧数目、解码图像尺寸和帧场编码模式选择标识等。
PPS (Picture Parameter Set)
图像参数集,作用于视频序列中的图像。如pic_ parameter_ set_ id、 熵编码模式选择标识、片组数目、初始量化参数和去方块滤波系数调整标识等。SPS和PPS是在IDR帧之前成对出现的。
H264压缩技术(算法)
- 帧内压缩:解决的是空域数据冗余问题,有损压缩。
- 帧间压缩:解决的是时域数据冗余问题,有损压缩。
- 整数离散余弦变换( DCT) , 将空间上的相关性变为频域上无关的数据然后进行量化,无损压缩。
- CABAC压缩,无损压缩。
宏块
宏块是视频压缩操作的基本单元,无论是帧内压缩还是帧间压缩,它们都以宏块为单位。
上面的是原始的一帧。
H264宏块划分
宏块具体的表现,压缩算法将对该宏块进行压缩。
宏块划分完成以后的样子。
H.264子块划分
他可以将一幅图片划分为好多个宏块,划分的宏块越小,对图片的控制越好,但是如果图片中,类似于纯色背景这样的图片,宏块划分越大,处理速度越快。
MPEG 2 和 H.264
在这幅图片中体现出了,H.264的压缩比大于MPEG 2.
宏块的尺寸
通常情况下,宏块为16x16,但是同时16x16又可以进一步进行划分。
桢内预测
H.264在帧内预测是使用的是宏块间的预测,即判断两个宏块之间的像素差别在哪。图片中相临像素差别不大,所以可以进行宏块预测,同时人对亮度的敏感度超过色度。由于H.264是对YUV数据进行压缩,YUV420大部分数据集中在亮度上,所有可以通过亮度或者灰度进行对图像的预测。
H.264的帧内预测模式
H.264有9种帧内预测模式,判断预测区域属于那种预测模式,因此只需要写入预测模式的需要即可。
下图展示了九种预测模式。
预测模式的row和column代表已经预测出来的像素。根据这9种模式进行预测其他地方的像素。
不同模式预测的结果
纵向模式,可以看出ABCD下面的像素都遵从它的列头。
同理,横向模式也是一样。
这一种模式是求平均值的方式。
以上所说的这9种例子,都是对灰度图像进行处理的,色彩(UV分量)不参与。
对图像的某些区域可以使用这9种模式,效果很理想,这样可以大大降低图像的存储空间。
帧内预测图像比较
可以看出预测的图片和原始图片的效果,很多地方很模糊。
这时就需要帧内预测残差值登场了。
这个残差值就相当于一个偏置项一样,对图像的预测结果进一步纠正,这个残差是通过原始图像和预测图像对比计算出来的。因此在存储时,要存储预测模式+残差,保证了图像不失真,降低了图像粗处空间。
帧间压缩
帧间压缩是在GOP内,根据参考帧,使用宏块匹配的基础找出帧与帧之间的运动矢量,即就是在参考帧当中某个宏块,对比其他帧之间这个帧的宏块位置,找到它的运动大小和运动方向,这就是运动估计(宏块匹配+运动矢量),还有运动补偿技术,在解码时,将运动补偿加上。
关键技术为:
- GOP
- 参考镇
- 运动估计
- 运动补偿
上面图片是宏块查找的例子,查找出运动矢量。
常见的宏块查找算法
- 三步搜索法
- 二维对数搜索
- 四部搜索
- 钻石搜索
视频产生花屏的原因
如果GOP分组中有帧丢失,会造成解码端的图像发生错误,这会出现马赛克(花屏)
视频卡顿的原因
为了避免花屏问题的发生,当发现有帧丢失时,就丢弃GOP内的所有帧,直到下一个IDR帧重新刷新图像。
I帧是按照帧周期来的,需要一个比较长的时间周期 ,如果在下一个I帧来之前不显示后来的图像,那么视频就静止不动了,这就是出现了所谓的卡顿现象。
无损压缩技术
视频经过了有损压缩,H.264认为压缩还是不够小,任何需要进一步的压缩。
DCT(离散余弦变换)变换
离散傅里叶变换需要进行复数运算,尽管有FFT可以提高运算速度,但在图像编码、特别是在实时处理中非常不便。离散傅里叶变换在实际的图像通信系统中很少使用,但它具有理论的指导意义。根据离散傅里叶变换的性质,实偶函数的傅里叶变换只含实的余弦项,因此构造了一种实数域的变换——离散余弦变换(DCT)。通过研究发现,DCT除了具有一般的正交变换性质外,其变换阵的基向量很近似于Toeplitz矩阵的特征向量,后者体现了人类的语言、图像信号的相关特性。因此,在对语音、图像信号变换的确定的变换矩阵正交变换中,DCT变换被认为是一种准最佳变换。在近年颁布的一系列视频压缩编码的国际标准建议中,都把 DCT 作为其中的一个基本处理模块。
参考博客:https://blog.csdn.net/allen_sdz/article/details/83279210
有损压缩后数据:
经过DCT变换后的数据,数据被移动到了左上角。
VLC压缩技术(可变长的编码)
类似于哈夫曼编码
CABAC压缩
VLC是MPEG2的压缩技术
CABAC是H.264的压缩技术,CABAC有着比VLC更好的压缩率。
H.264编码流程
Fn是帧内预测,Fn-1‘是帧间预测(需要经过运动评估和运动补偿),两个步骤都要经过DCT转化,量化编码以及熵编码,到达NAL层。解码时进行反向操作。
H.264码流分层
NAL层(Network Abstraction Layer)视频数据网络抽象层
为什么需要增加NAL层?在二进制传输过程中,为了防止二进制传输数据乱序、丢包和重传。
VCL层(Video Coding Layer)视频数据编码层
在视频帧有好多个图像,一个图像内又有多个slice,在一个slice里面,包含多个宏块。一般情况下,一个图像仅仅包含一个slice
码流的基本概念
SODB(String of Data Bits)
原始数据比特流,长度不一定是8的倍数,故需要补齐。它是由VCL层产生的。
RBSP(Raw Byte Sequence Payload)
SODB + trailing bits
算法: 如果SODB的最后一个字节不对齐,则补1和多个0。
NALU
H264切片
NAL Header(1B)+ RBSP
Slice和MacroBlock
码流分层
Annexb格式比RTP格式出一个StartCode头,Annexb格式时文件开头的,RTP格式是在网络上传输时使用的。