视频编解码

Posted zcat

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了视频编解码相关的知识,希望对你有一定的参考价值。

视频编码 == 视频压缩
视频解码 == 视频解压缩后播放

视频压缩的情况

对于物品没动,只有摄像头动的情况:
全局运动预测
存整体信息和镜头运动轨迹

对于摄像头没动,镜头里只有局部物品运动的情况:
存发生变化的(8x8)格子信息

对于镜头切换的情况:
Intra frame 关键帧
Prediction Frame 预测帧, 是用 Intra 加上差值信息动态计算出来的图像
Bidirection Frame 双向预测帧

运动补偿和运动预测算法,是成熟的

视频压缩的流程

  1. 提取出关键帧序列;针对每一个关键帧处理如下:
    1. 取下一张预测帧,如果没有则continue,否则执行如下:
    2. 算出预测信息和预测差值图
    3. 将结果记录到视频文件里

例子

算出预测信息和预测差值图

1)预测帧的编码
输入:图a,图b
输出:图b的预测信息 b.vblock
实现:

  1. 把 图b 划分为 8x8 的图块
  2. 对于每一个 图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

视频解压缩的流程

  1. 解析视频文件,提取出关键帧序列;
  2. 针对每一个关键帧还原后面的预测帧,处理如下:
    1. 取下一张预测帧,如果没有则continue,否则执行如下:
    2. 通过 预测信息与差值图 还原出 预测帧

预测帧的还原

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

常见问题

视频播放马赛克问题

预测帧没做好差值,即找不到上一帧相似的颜色,还继续做差值运算;

花屏持续几秒钟

播放器问题,刚好跳到非关键帧的地方,此时没有基于对的关键帧还强制解出来,就是错的画面;
应该跳到下一个关键帧;

以上是关于视频编解码的主要内容,如果未能解决你的问题,请参考以下文章

音视频编解码之路:JPEG编码

音视频编解码之路:JPEG编码

H.264/AVC视频编解码技术详解十熵编码算法:CAVLC原理

视频的编解码-编码篇

视频编解码的理论和实践2:Ffmpeg视频编解码

如何在 iOS 上使用 ProRes 编解码器录制视频?