视频编码分类
现在视频编码主要是MPEG系列和H.26X系列,其中H.264是现在主流的视频编码方式,与H.263+和MPEG4 SP相比,减小50%比特率,实现高压缩
H.264基本概念
H.264压缩标准中I帧、P帧、B帧用于表示传输的视频画面。
I帧:关键帧。属于帧内压缩技术,视频的第一帧肯定是关键帧。
P帧:向前压缩帧。压缩时只依赖于前一帧,属于帧间压缩技术。如果P帧丢失会造成花屏
B帧:双向压缩帧。压缩时既参考前一帧也参考后一帧,属于帧间压缩技术。好处是可以实现更高的压缩率,因为比如P帧下一帧信息已经存储了,所以只需要存储差异。缺点是对网络要求更高,因为需要等待下一帧到来。
GOF 一组帧
SPS:序列参数集,存放帧数、参考帧数目、解码图像尺寸、帧场编码模式选择标识等
PPS:图像参数集,存放熵编码模式选择标识、片组数目、初始量化参数和去方块滤波系数调整标识等
SPS和PPS是解码的基础,属于I帧。
H.264编码原理
H.264压缩技术
帧内预测压缩:解决空域数据冗余问题。比如图里人眼不明感颜色等可以删除的
帧间预测压缩:解决时域数据冗余问题。比如帧间重复数据
整数离散余弦变换(DCT):将空间上相关性变为频域上无关的数据后进行量化
CABAC:上下文适应的无损压缩
H.264宏块划分与分组
可以参考这个blog
https://www.cnblogs.com/oldmanlv/p/5897546.html
对比MPEG2 和H.264字块划分结果:
帧分组:图像变化较小可以进行分组,通过算法得到每一帧位置,比如球的滚动
运动矢量与补偿压缩
通过算法进行连续的运动估算,得到运动矢量和残差数据,实现帧间压缩
通过不同帧内预测模式(9种)计算残差值(下图2),实现帧内压缩。预测的图和残差值进行累加可以得到原图
H.264切片与宏块
片:一帧视频图像可编码成一个或者多个片,每片包含切片头和切片数据,每个数据包涵整数个宏块,即每片至少一个宏块,最多时包含整个图像的宏块,宏块包涵宏块类型、宏块预测和编码残差数据
以下为关系图:
安卓视频用法
VideoView 是Android实现视频播放主要控件,通过MediaPlayer来对视频文件进行控制的,支持mp4、avi、3gp格式。
MediaController是一个多媒体的类,支持快进、快退、上一个、下一个等多媒体操作。
有复杂的业务要求需重写VideoView
public class MovieView extends VideoView implements View.OnTouchListener, View.OnKeyListener{}