H.264编码流程======================================
H.264 编码器
简易框架
帧内:主要对IDR,和I帧编码
帧间:主要对B帧,P帧
划分宏块
H264默认是使用 16X16 大小的区域作为一个宏块,也可以划分成 8X8 大小,一般都是这两种方式。
帧内预测
H.264根据块的大小来执行不同的预测模式,主要对IDR,I帧编码。
- 16x16:有4种预测模式
- 8x8:有4种预测模式
- 4x4:有9种预测模式
预测值和当前值相减,得到残差,然后代替系数值,从而增加零值和较小值的概率,达到一定压缩效果。
但是,如果图像丰富,帧内预测编码效率往往不高。
帧间预测
主要对P帧(前向帧),B帧(双向帧)编码。
帧间预测就是在一定窗口内搜索到最佳匹配宏块,然后这两个宏块相减得到预测残差。
由于实际运动轨迹不是移动整数个像素点,所以算法提出了1/2像素,1/4像素,1/8像素,主要为1/2。
重建图像插值
连续运动的物体,其轨迹是连续的,而像素是离散的,所以只用整数像素来表示运动物体显然是不准确的,因此有非整数运动轨迹之称。
对于前向预测编码的参考帧而言,只有重建参考帧,就需要在此参考帧的基础上插值出多帧非整数像素运动轨迹的参考帧。
运动估计算法
在参考帧中对当前宏块搜索最佳匹配宏块,估计出最佳运动矢量大小。
搜索算法有:三步搜索法,对数搜索法,四步搜索法,菱形搜索法,六边形搜索法。
运动幅度较大用:六边形和菱形
图像复杂用:全局搜索
总的流程:在参考帧中找到最佳匹配宏块,对匹配宏块做运动矢量,然后根据运动矢量选择插值帧:水平插值,垂直插值,斜角插值,最后做减法运算,完成运动补偿。
变换编码
把时间或空间信号变为频域信号,变换编码的数据源有两种:一是图像数据本身,二是图像残差。
变换中的正交编码可用于图像编码。如:K-L变换,DCT(离散余弦变换),小波变换等。
通常以16x16,8x8的宏块来编码。
H.264优于其他算法的一个很重要的原因就是采用了整数DCT编码。
DCT原理:https://blog.csdn.net/dugudaibo/article/details/78410570
量化编码
量化编码是把DCT系数除以一个常量,经过量化后的结果是量化步长的整数被或为更多的零值,从而达到压缩的目的。
量化会导致失真,这也是H.264失真的一个重要因素。
Z字形扫描
左上角表示频域的低频分量(大部分),右下角表示高频分量(小部分)
变换使空域的图像能量重新分布,主要集中在左上角。右下方下部分是较小值或零值,为了把左上方重要的非零值按照一维顺序串联起来,需要把变换后的系数按照一定的次序重新放置,采用“Z”字型扫描就可以把图像块的这些非零值串联起来,从而把更多的零值丢弃,这样便于后续的熵编码。
如下面一个矩阵:
{
3, 2, -1, 0,
1, 0, 1, 0,
-1, 0, 0, 0,
0, 0, 0, 0,
}
扫描:
扫描重排之后得到一维数组:[3, 2, 1, -1, 0, -1, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0]
熵编码
图像或残差采用熵编码如:CABAC(上下文自适应边长编码),CAVLC。
视频的其他信息如:运动矢量,直流分量,编码模式等控制信息的编码方式采用其他方法,如指数哥伦布编码。
注意:视频数据失真主要是因为变换和量化。
环路滤波
消除经反变换和反量化后重建中由于预测误差产生的块效应,从一方面改善图像的主观质量,另一方面减少预测误差。
与以往的不同,经环路滤波后的图像将根据需要放在缓存中用于帧间预测,而不是仅仅在输出重建图像时用来改变主观质量,也就是说该滤波器位于解码环中,而非解码环的输出外。
H.264的其他知识=================================
VCL(视频编码层)和 NAL(网络提取层).
- VCL:包括核心压缩引擎和块,宏块和片的语法级别定义,设计目标是尽可能地独立于网络进行高效的编码。
- NAL:负责将VCL产生的比特字符串适配到各种各样的网络和多元环境中,覆盖了所有片级以上的语法级别。
NALU
NALU:(Network Abstract Layer Unit)网络抽象层单元。
RBSP:(Raw Byte Sequence Payload)原始字节序列载荷。
SODB:String Of Data Bits (原始数据比特流, 长度不一定是8的倍数,故需要补齐,是由VCL产生)。
SODB是以值为1的一个比特结束,如果没有字节对齐,就用0补齐,所以从后往前第一个值为1的位置就为,SODB的最后一个字节。
逻辑关系:RBSP trailing bits 是拖尾字节,用于字节对齐。
NALU = NALU Header + EBSP
IDR(及时解码刷新 Instantaneous Decoding Refresh)
I 和 IDR 帧都是使用帧内预测的。 它们都是同一个东西而已,在编码和解码中为了方便, 要首个 I 帧和其他 I帧区别开, 所以才把第一个首个 I 帧叫 IDR, 这样就方便控制编码和解码流程。 IDR 帧的作用是立刻刷新,使错误不致传播,从 IDR 帧开始,重新算一个新的序列开始码。
而 I 帧不具有随机访问的能力, 这个功能是由 IDR 承担。IDR 会导致 DPB(DecodedPictureBuffer 参考帧列表——这是关键所在) 清空, 而 I 不会。 IDR 图像一定是 I 图像,但 I 图像不一定是 IDR 图像。 一个序列中可以有很多的 I 图像, I 图像之后的图像可以引用 I 图像之间的图像做运动参考。
一个序列中可以有很多的 I 图像, I 图像之后的图象可以引用 I 图像之间的图像做运动参考。对于 IDR 帧来说, 在 IDR 帧之后的所有帧都不能引用任何 IDR 帧之前的帧的内容, 与此相反, 对于普通的I-帧来说, 位于其之后的 B-和 P-帧可以引用位于普通 I-帧之前的 I-帧。 从随机存取的视频流中, 播放器永远可以从一个 IDR 帧播放, 因为在它之后没有任何帧引用之前的帧。 但是, 不能在一个没有 IDR 帧的视频中从任意点开始播放, 因为后面的帧总是会引用前面的帧。
HTTP与RTSP传输的差别。概括的讲,RTSP被许多公司防火墙拒绝,而HTTP可以作为一个普通的文件通过;RTSP适合于大数据量、高可用性的流,如直播事件、长事件或大型文件;HTTP更适合于较小的数据传输和交互;当终端用户正在观看时,RTSP允许用户在服务器有效的回放媒体,HTTP更象下载一段媒体并在客户机上播放。从终端用户观点来看,RTSP看起来像是文件从中心位置播放,有点象广播,而HTTP感觉更象时从视频库中取视频,并在家里的机器上播放。从服务质量的观点上看,对于流,RTSP有更好的体验,RTSP提供类似于VCR的媒体控制,如暂停、快进、倒退和绝对定位。使用HTTP传输,只能在整个流下载完成后,播放器软件再模拟该过程。虽然,RTSP能够使用TCP或UDP,但是RTSP控制经常与RTP联合使用,以最好的服务质量传送实际的媒体数据。
实时传输控制协议RTCP(RealtimeTransportControl Protocol):负责管理传输质量在当前应用进程之间交换控制信息。在RTP会话期间,各参与者周期性地传送RTCP包,包中含有已发送的数据包的数量、丢失的数据包的数量等统计资料,因此,服务器可以利用这些信息动态地改变传输速率,甚至改变有效载荷类型。RTP和RTCP配合使用,能以有效的反馈和最小的开销使传输效率最佳化,故特别适合传送网上的实时数据。