H264基本知识

Posted 顾文繁

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了H264基本知识相关的知识,希望对你有一定的参考价值。

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格式是在网络上传输时使用的。

以上是关于H264基本知识的主要内容,如果未能解决你的问题,请参考以下文章

H264 编码基本原理

视频知识点(20)- H264码流如何在SPS中获取宽高信息?

视频知识点(20)- H264码流如何在SPS中获取宽高信息?

音视频开发之旅(56) -H264/AVC基本结构

音视频开发之旅(56) -H264/AVC基本结构

H264视频压缩算法