从上面的解释看 , 我们知道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- ) , 然后再用霍夫曼()编码或者用算术编码 。
文章插图
2.2.预测图像P的压缩编码算法
预测图像的编码也是以图像宏块()为基本编码单元 , 一个宏块定义为I×J像素的图像块 , 一般取16×16 。预测图像P使用两种类型的参数来表示:一种参数是当前要编码的图像宏块与参考图像的宏块之间的差值 , 另一种参数是宏块的移动矢量 。假设编码图像宏块MPI是参考图像宏块MRJ的最佳匹配块 , 它们的差值就是这两个宏块中相应像素值之差 。对所求得的差值进行彩色空间转换 , 并作4:1:1的子采样得到Y , Cr和Cb分量值 , 然后仿照JPEG压缩算法对差值进行编码 , 计算出的移动矢量也要进行霍夫曼编码 。
文章插图
2.3.双向预测图像B的压缩编码算法
文章插图
2.4.图像结构
MPEG 编码器算法允许选择I图像的频率和位置 。I图像的频率是指每秒钟出现I图像的次数 , 位置是指时间方向上帧所在的位置 。一般情况下 , I图像的频率为2 。MPEG编码器也允许在一对I图像或者P图像之间选择B图像的数目 。I图像、P图像和B图像数目的选择依据主要是根节目的内容 。例如 , 对于快速运动的图像 , I图像的频率可以选择高一些 , B图像的数目可以选择少一点;对于满速运动的图像I图像的频率可以低一点 , 而B图像的数目可以选择多一点 。此外 , 在实际应用中还要考虑媒体的速率 。
- 自媒体素材库——月薪3W+自媒体人都在用的。
- H.264 ,MPEG-2,MPEG-1,H.263,MPEG-4系列
- 全美最适合工作的公司——谷歌,是如何为员工制造幸福的
- x264函数调用关系图 FFMPEG中MPEG-2编解码函数调用关系图MPEG
- 4.2——Node.js的npm和包
- 完 PAJ7620U2手势识别——读取手势数据寄存器数据与LED指示
- 6 PAJ7620U2手势识别——配置手势数据寄存器
- FFmpeg/OpenCV 实现全屏斜体水印
- KuPay:怎么做好数字钱包的核心需求——安全性
- 手摸手学会node框架之一——koa 傻瓜式小白教程