视频编码 == 视频压缩
视频解码 == 视频解压缩后播放
视频压缩的情况
对于物品没动,只有摄像头动的情况:
全局运动预测
存整体信息和镜头运动轨迹
对于摄像头没动,镜头里只有局部物品运动的情况:
存发生变化的(8x8)格子信息
对于镜头切换的情况:
Intra frame 关键帧
Prediction Frame 预测帧, 是用 Intra 加上差值信息动态计算出来的图像
Bidirection Frame 双向预测帧
运动补偿和运动预测算法,是成熟的
视频压缩的流程
- 提取出关键帧序列;针对每一个关键帧处理如下:
- 取下一张预测帧,如果没有则continue,否则执行如下:
- 算出预测信息和预测差值图
- 将结果记录到视频文件里
算出预测信息和预测差值图
1)预测帧的编码
输入:图a,图b
输出:图b的预测信息 b.vblock
实现:
- 把 图b 划分为 8x8 的图块
- 对于每一个 图b 中的图块,在 图a 中查找最相似的图块的座标
- 比如对于 b 中一个图块(座标为 8, 8)在 a 中搜索 x(0-15) y(0-15) 这么大的范围(从 8,8 开始搜索)
- 图块的相似度算法(SAD),求出[图块中 [每个像素的差的绝对值] 的和],当大于某个值的时候,认为图块不相似了
- 图块不相似的时候,存差值最小的图块坐标
2) 将预测信息还原出图片b1
输入:图a,b.vblock
输出:b.vblock
表达的图片b1
实现:b.vblock 有图a的坐标,一次遍历就可还原出图片
3)算出差值图
输入:b.vblock
表达的图片b1,图b
输出:图b的差值图
实现:差值公式为 (b1 - b) / 2 + 128
伪代码表示:
encode:
input: a.png, b.png
output: b.vblock, b.diff.png
process:
a.png + b.png → b.vblock
a.png + b.vblock → 预测图b1
预测图b1 + b.png → b.diff.png
视频解压缩的流程
- 解析视频文件,提取出关键帧序列;
- 针对每一个关键帧还原后面的预测帧,处理如下:
- 取下一张预测帧,如果没有则continue,否则执行如下:
- 通过 预测信息与差值图 还原出 预测帧
预测帧的还原
1) 将预测信息还原出图片b1
输入:图a,b.vblock
输出:b.vblock
表达的图片
实现:b.vblock 有图a的坐标,一次遍历就可还原出图片
2)将图片b1还原出预测帧
输入:b.vblock
表达的图片b1,图b
输出:图b的差值图
实现:差值公式为 b1 - (b - 128) * 2
伪代码表示
decode:
input: a.png, b.vblock, b.diff.png
output: b.png
process:
a.png + b.vblock → 预测图b1
预测图b1 + b.diff.png → b.png
常见问题
视频播放马赛克问题
预测帧没做好差值,即找不到上一帧相似的颜色,还继续做差值运算;
花屏持续几秒钟
播放器问题,刚好跳到非关键帧的地方,此时没有基于对的关键帧还强制解出来,就是错的画面;
应该跳到下一个关键帧;