背景知识
在相邻几幅图像画面中,一般有差别的像素只有10%以内的点,亮度差值变化不超过2%,而色度差值的变化只有1%
对于一段变化不大图像画面,可以先编码出一个完整的图像帧A,随后的B帧就不编码全部图像,只写入与A帧的差别,这样B帧的大小就只有完整帧的1/10或更小
B帧之后的C帧如果变化不大,我们可以继续以参考B的方式编码C帧,这样循环下去。
这段图像我们称为一个序列:序列就是有相同特点的一段数据
当某个图像与之前的图像变化很大,无法参考前面的帧来生成,那我们就结束上一个序列,开始下一段序列
也就是对这个图像生成一个完整帧A1,随后的图像就参考A1生成,只写入与A1的差别内容
H264中四种压缩技术
帧间预测压缩(Motion Compensation),解决的是时域数据冗徐问题,用于预测信号
预测Motion vector,获得Residual Picture并存储
帧内预测(Intra Prediction),解决的是空域数据冗余问题,用于预测信号
整数离散余弦变换(DCT),用于对信号进行变换
将空间上的相关性变为频域上无关的数据然后进行量化,并非H.264独有,区别在于相较于MPEG2,进行了子块划分,从而实现更高的效率
CABAC(Context-based Adaptive Binary Arithmetic Coding)压缩,用于对信号进行变换
基于熵编码改进,增加前后文关联性的考虑
编码思路
得到预测信号->计算残差信号(residual signal)->残差信号(residual signal)变换->量化熵编码
编码步骤
分组:几帧图像作为一个图像序列(GOP),为防止运动变化,帧数不宜取多
定义:将每组内各帧图像定义为三种类型,即I帧、B帧、P帧、SP帧和SI帧
预测:以I帧做为基础帧,以I帧预测P帧,再由I帧和P帧预测B帧
传输:最后将I帧数据与预测的差值信息进行变换和传输
GOP序列与IDR帧(Instantaneous Decoder Refresh)
在H264中图像以序列为单位进行组织,一个序列是一段图像编码后的数据流
一个序列的第一个图像叫做 IDR 图像(立即刷新图像),IDR 图像都是 I 帧图像
引入 IDR 图像便于解码重同步,当解码器解码到 IDR 图像时,立即将参考帧队列清空,将已解码的数据全部输出或抛弃,重新查找参数集,开始一个新的序列。如果前一个序列出现重大错误,这里获得重新同步的机会。
IDR图像之后的图像永远不会使用IDR之前的图像的数据来解码。
编码帧(I,P,B,SP,SI)
I帧(intraframe frame)帧内压缩。 关键帧。IDR帧(Instantaneous Decoder Refresh)属于I帧
P帧(forward Predicted frame)向前参考帧。压缩时,只参考前面已经处理的帧,它占I帧的一半的大小
B帧(Bidirectionally predicted frame)帧间压缩。双向参考帧。压缩时,同时参考前面已处理的帧和后面的帧,它占I帧的1/4大小
SP帧(辅助P):用于不同编码流之间的切换
设{P1,n-1,P1,n,P1,n+1}和{P2,n-1,P2,n,P2,n+1} 分别是同一视频序列采用了不同的信源编码参数编码所得到的两个视频流。由于编码参数不同,两个码流中同一时刻的帧,如P1,n-1 和P2,n-1,并不完全一样。
假设服务器首先发送视频流P1,n-2,到时刻n 再发送视频流P2n,则解码端接收到的视频流为{P1,n-2,P1,n-1,P2,n,P2,n+1,P2,n+2}
在这种情况下,由于接收的P2,n 应使用的参考帧应该是P2,n-1 而不是P1,n-1,所以P2,n 帧就不能完全正确地解码。在以往的压缩标准中需要使用之前的I帧,这样做增大了带宽需求。而SP帧可以实现不同根据不同的信源产生相同的编码,从而解决这个问题
SI帧:用于不同信号流的切换
SI帧:对于关注同一事件而处于不同视角的多台摄像机的输出码流间的切换和电视节目中插入广告等问题,这就涉及到拼接不同图像序列生成码流的问题。由于各个码流来自于不同的信源,帧间缺乏相关性,切换点处的辅帧如果仍采用帧间预测的辅SP帧,编码效率就不会那么有效,而应采用空间预测的SI 帧——SI2,n 帧
思路和作用与SP帧类似,区别在于SP为iner prediction,SI为intra prediction
H.264分层设计
H264将系统框架分为两个层面,分别是视频编码层面(VCL)和网络抽象层面(NAL),具体地讲又被分为了序列、图像、片、宏块、子宏块五个层次
VCL:(Video Coding Layer)视频编码层,负责高效的内容表示。
NAL:(Network Abstraction Layer)网络提取层,负责以网络所要求的恰当的方式对数据进行打包和传送。
码流结构
NAL:VCL数据(被压缩编码后的视频数据序列)要封装到NAL单元中之后,才可以用来传输或存储
SPS:序列参数集 (Sequence Paramater Set),作用于一系列连续的编码图像,记录了编码的profile、level、图像宽高等
PSS:图像参数集 (Picture Paramater Set) ,作用于编码视频序列中一个或多个独立的图像,PPS记录了每一帧编码后数据所依赖的参数
NALU根据nal_unit_type的类型,可以分为:VCL的NAL单元和非VCL的NAL单元
NALU单元与一帧图片的关系(slice)
H.264编码器将一帧图片编码为一个或多个切片(slice),NALU装载着这些Slice
宏块(Macroblock) 与 切片(slice)
切片:片的主要作用是用作宏块(Macroblock)的载体,主要目的是为了限制误码的扩散和传输
片分为两部分:片头与片数据
片数据中是宏块
片头中包含着分片类型、分片中的宏块类型、分片帧的数量、分片属于那个图像以及对应的帧的设置和参数等信息
I片:只包 I宏块,I 宏块利用从当前片中已解码的像素作为参考进行帧内预测(不能取其它片中的已解码像素作为参考进行帧内预测)。
P片:可包 P和I宏块,P 宏块利用前面已编码图象作为参考图象进行帧内预测,一个帧内编码的宏块可进一步作宏块的分割:即 16×16、16×8、8×16 或 8×8 亮度像素块(以及附带的彩色像素);如果选了 8×8 的子宏块,则可再分成分割为 8×8、8×4、4×8 或 4×4 的子宏块
B片:可包 B和I宏块,B 宏块则利用双向的参考图象进行帧内预测
SP片:包含P宏块或I宏块,用于不同编码流之间进行切换
SI片:包含SI宏块,用于不同编码流之间进行切换
宏块
根据严格复杂的编码要求对图片进行小块划分和编码
宏块是视频信息的主要承载者,包含了宏块类型、预测类型、Coded Block Pattern、Quantization Parameter、16×16亮度像素、8×8 的彩色像素块。每个图象中,若干宏块被排列成片的形式。视频解码最主要的工作则是提供高效的方式从码流中获得宏块中的像素阵列。
参考: