流媒体 6——MPEG电视( 二 )


从上面的解释看 , 我们知道I和P的解码算法比较简单 , 资源占用也比较少 , I只要自己完成就行了 , P呢 , 也只需要解码器把前一个画面缓存一下 , 遇到P时就使用之前缓存的画面就好了 , 如果视频流只有I和P , 解码器可以不管后面的数据 , 边读边解码 , 线性前进 , 大家很舒服 。但网络上的电影很多都采用了B帧 , 因为B帧记录的是前后帧的差别 , 比P帧能节约更多的空间 , 但这样一来 , 文件小了 , 解码器就麻烦了 , 因为在解码时 , 不仅要用之前缓存的画面 , 还要知道下一个I或者P的画面(也就是说要预读预解码) , 而且 , B帧不能简单地丢掉 , 因为B帧其实也包含了画面信息 , 如果简单丢掉 , 并用之前的画面简单重复 , 就会造成画面卡(其实就是丢帧了) , 并且由于网络上的电影为了节约空间 , 往往使用相当多的B帧 , B帧用的多 , 对不支持B帧的播放器就造成更大的困扰 , 画面也就越卡 。一般平均来说 , I的压缩率是7(跟JPG差不多) , P是20 , B可以达到50 , 可见使用B帧能节省大量空间 , 节省出来的空间可以用来保存多一些I帧 , 这样在相同码率下 , 可以提供更好的画质 。
2.1.帧内图像I的压缩编码算法
如果电视图像是用RGB空间表示的 , 则首先把它转换成YCrCb空间表示的图像 。每个图像平面分成8×8的图块 , 对每个图块进行离散余弦变换 DCT() 。DCT变换后经过量化的交流分量系数按照Zig-zag的形状排序 , 然后再使用无损压缩技术进行编码 。DCT变换后经过量化的直流分量系数用差分脉冲编码DPCM( Code ) , 交流分量系数用行程长度编码RLE(run- ) , 然后再用霍夫曼()编码或者用算术编码 。

流媒体 6——MPEG电视

文章插图
2.2.预测图像P的压缩编码算法
预测图像的编码也是以图像宏块()为基本编码单元 , 一个宏块定义为I×J像素的图像块 , 一般取16×16 。预测图像P使用两种类型的参数来表示:一种参数是当前要编码的图像宏块与参考图像的宏块之间的差值 , 另一种参数是宏块的移动矢量 。假设编码图像宏块MPI是参考图像宏块MRJ的最佳匹配块 , 它们的差值就是这两个宏块中相应像素值之差 。对所求得的差值进行彩色空间转换 , 并作4:1:1的子采样得到Y , Cr和Cb分量值 , 然后仿照JPEG压缩算法对差值进行编码 , 计算出的移动矢量也要进行霍夫曼编码 。
流媒体 6——MPEG电视

文章插图
2.3.双向预测图像B的压缩编码算法
流媒体 6——MPEG电视

文章插图
2.4.图像结构
MPEG 编码器算法允许选择I图像的频率和位置 。I图像的频率是指每秒钟出现I图像的次数 , 位置是指时间方向上帧所在的位置 。一般情况下 , I图像的频率为2 。MPEG编码器也允许在一对I图像或者P图像之间选择B图像的数目 。I图像、P图像和B图像数目的选择依据主要是根节目的内容 。例如 , 对于快速运动的图像 , I图像的频率可以选择高一些 , B图像的数目可以选择少一点;对于满速运动的图像I图像的频率可以低一点 , 而B图像的数目可以选择多一点 。此外 , 在实际应用中还要考虑媒体的速率 。