二:编解码框架

第四章 视频编码基础

1. 压缩码流

  • 语法:码流中各个元素的位置关系

    • 01001001…
    • 图像编码类型(01),宏块类型(00),编码系数1001等
  • 语义:每个语法元素所表达的意义。
    • 例如:图像编码类型

2. 编码层次

  • 序列(Sequence)
  • 图像组(Group of Pictures,GOP)
  • 图像(Picture)
  • 条带(Slice)
  • 宏块(Macroblock,MB)
  • 块(Block)

3. 码流结构

3.1 PB帧编码

4. 序列编码对象

(1)IBBP序列

  • 序列:一段连续编码的并具有相同参数的视频图像。
  • 序列起始码:专有的一段比特串,标识一个序列的压缩数据的开始
    • MPEG-2的序列起始码为十六进制数000001(B3)。
  • 序列头:记录序列信息
    • 档次(Profile),级别(Level),宽度,高度,是否是逐行序列,帧率等。
  • 序列结束码:专有的一段比特串,标识该序列的压缩数据的结束
    • MPEG-2的序列结束码为十六进制数000001(B7)。

5. 图像组编码对象

6. 图像编码结构

  • 图像:
  • 图像起始码:专有的一段比特串,标识一个图像的压缩数据的开始
    • MPEG-2的图像起始码为十六进制数000001(00)。
  • 图像头:记录图像信息
    • 图像编码类型,图像距离,图像编码结构,图像是否为逐行扫描。

7. 图像分块编码

8. 条带编码结构

  • 条带:多个宏块的组合。
  • 条带起始码:专有的一段比特串,标识一个条带的压缩数据的开始
    • MPEG-2的条带起始码为十六进制数000001(0~AF)。
  • 条带头:记录当前图像的相关信息
    • 条带位置,条带量化参数,宏块编码技术标识等。

9. 条带编码对象

10. 宏块编码结构

  • 宏块:16x16的像素块(对亮度而言)。
  • 宏块内容:宏块编码类型,编码模式,参考帧索引,运动矢量信息,宏块编码系数等。

11. 宏块编码对象

12. 块编码结构

  • 8x8或4x4块的变换量化系数的熵编码数据。
  • CBP (Coded Block Patten):用来指示块的变换量化系数是否全为零。
    • 对于YUV(4:2:0)编码,CBP通常6比特长,每个比特对应一个块,当某一块的变换量化系数全为零时,其对应比特位值为0,否则为1。
  • 每个块的变换量化系数的最后用一个EOB (End of Block)符号来标识。

13. 视频编解码关键技术

  • 预测:通过帧内预测和帧间预测降低视频图像的空间冗余和时间冗余。
  • 变换:通过从时域到频域的变换,去除相邻数据之间的相关性,即去除空间冗余。
  • 量化:通过用更粗糙的数据表示精细的数据来降低编码的数据量,或者通过去除人眼不敏感的信息来降低编码数据量。
  • 扫描:将二维变换量化数据重新组织成一维的数据序列。
  • 熵编码:根据待编码数据的概率特性减少编码冗余。

14. 预测

  • 空间预测:利用图像空间相邻像素的相关性来预测的方法。

    • 帧内预测技术:利用当前编码块周围已经重构出来的像素预测当前块
    • Intra图像编码(I帧)
  • 时间预测:利用时间上相邻图像的相关性来预测的方法。
    • 帧间预测:运动估计(Motion Estimation,ME),运动补偿(Motion Compensation,MC)
    • Inter图像编码:前向预测编码图像(P帧),双向预测编码图像(B帧)

15. 帧内预测

  • I帧图像的每个宏块都采用帧内(Intra)预测编码模式。
  • 宏块分成8x8或者4x4块,对每个块采用帧内预测编码,称作Intra8x8或者Intra4x4。
  • 帧内预测有多个预测方向:水平,垂直,左下,右上。
  • 帧内预测还有直流(DC)预测。
  • 色度块预测还有平面预测。

16. 帧间预测

  • 块基运动估计:为待预测块在参考帧上找到最佳的预测块,并记录预测块在参考帧上的相对位置。
  • 运动矢量(MV):参考帧上的预测块与当前帧上的的待预测块的相对位置。
    • MV有两个分量:(x,y)

  • 分像素运动估计
    • 最佳的预测块不在整像素位置,而在分像素位置;
    • 1/2,1/4,1/8像素插值得到分像素值。

  • 帧间预测流程:

  • 运动补偿:给定MV和参考帧,为待解码块从参考帧上获取预测块。
  • 运动矢量编码
    • MV预测:用当前块的周围可得到邻块的运动矢量来预测当前块的运动矢量
    • 运动矢量差(MV difference,MVD):实际运动矢量与预测运动矢量的差,即:
    • 运动矢量差采用变长编码。

17. 预测残差

18. 变换编码

  • 变换编码:通过变换将空域信号转换为频域信号来去除空间信号的冗余信息,减少编码数据。
  • 二维离散余弦变换
    • 4x4变换,8x8变换

  • 二维离散余弦变换

例:

  • 变换系数:直流(DC)系数,交流(AC)系数

19. 量化

  • 量化原理:将含有大量的数据集合映射到含有少量的数据集合中。

  • 一般情况下量化后高频部分包含大量的零系数

  • 量化对主观质量的影响

20. 扫描

  • 扫描:将二维数据转换为一维的数据序列。

21. 熵编码

  • 熵编码:根据符号出现的概率,对经常出现的符号分配较短的码字,对不常出现的符号分配较长的码字。
  • Level-Run编码:用数据中非零值和其前面非零值之间出现零值的个数重新描述量化系数序列为(Level,Run)二元组序列

  • 变长编码

    • 将Level-Run编码后的(level,run)变长编码成最终的比特串。

22. 码率控制

  • 受到缓冲区,带宽的限制,编码码率不能无限制的增长,因此需要通过码率控制来将编码码流控制在目标码率范围内。
  • 一般通过调整量化参数的手段控制码率
    • 帧级控制
    • 条带级控制
    • 宏块级控制
  • 码率控制考虑的问题
    • 防止码流有较大的波动,导致缓冲区发生溢出,
    • 同时保持缓冲区尽可能的充满,让图像质量尽可能的好而且稳定
  • CBR(Constant Bit Rate)
    • 比特率稳定,但图像质量变化大
  • VBR(Variable Bit Rate)
    • 比特率波动大,但图像质量稳定
  • 码率控制算法
    • 码率分配
    • 码率控制
  • 码率控制属于非标准技术
    • 编码端有,解码端没有

第5章 预测

1. 预测技术

  • 目的:去除空间冗余和时间冗余。
  • 视频存在大量的空间冗余和时间冗余
    • 空间冗余:用帧内预测编码去除

      • 基于块的帧内预测
    • 时间冗余:用帧间预测编码去除
      • 基于块匹配(Block Matching)的帧间预测
  • 预测后得到去除大部分空间或时间冗余的残差

2. 空间冗余

  • 图像空间相邻像素具有很强的相关性。
  • 帧内预测技术去除空间冗余

3. 亮度预测模式

4. 色度预测模式

5. 时间冗余

  • 视频图像在时间上有较强的相关性,即存在时间冗余
  • 去除时间冗余的编码技术
    • 运动估计(Motion Estimation,ME)

      • 为待编码块搜索最相似的预测块
      • 记录运动矢量(Motion Vector,MV)
      • 记录预测残差:
    • 运动补偿(Motion Compensation,MC)
      • 根据运动矢量获取预测块
      • 根据预测残差计算重构块:

6. 运动模型

(1)平移

7. 匹配准则

8. 匹配准则简化

  • 简化技术方法

    • 分别计算当前块和预测块的象素值和
    • 根据简化形式,比较当前块和预测块
    • 如果用简化准则对预测块和当前块比较的结果比以前最好的结果差,可以确定预测效果不好,不必对预测块再进行比较。

9. 运动估计

  • 去除视频图像的时间冗余
  • 运动估计在搜索范围内为当前块寻找匹配最好的预测块
  • 全搜索方式的运动估计计算复杂度高

10. 全搜索复杂度分析

  • 图像大小:MxM
  • 预测块大小:NxN
  • 搜索范围:(-R,R)
  • 每个搜索点象素比较个数:N2
  • 搜索点个数(2R+1)2
  • 在搜索范围内的象素比较个数总和N2(2R+1)2
  • 一帧图像所有块的全搜索象素比较个数总和N2(2R+1)2(M/N)2=(2R+1)2M2
  • 例:M=512,N=4,R=8,帧率:30帧/秒

    (2R+1)2M2

    =172X5122

    = 75759616次/帧

    = 75759616x30次/秒

    =2272788480次/秒

    采用SSD匹配准则:每次象素比较需1个减法,1个乘法,1个加法,则上述全搜索计算每秒需要2272788480x2次加减法和2272788480次乘法操作。

11. 快速运动估计

  • 在保持预测精度的同时减少运动估计的搜索次数。

    • 三步搜索(Three Step Search,TSS)
    • 二维Log搜索(2D Logarithmic Search,2DLOG)
    • 正交搜索(Orthogonal Search Algorithm,OSA)
    • 十字搜索(Cross Search Algorithm,CSA)
    • 新三步搜索(New Three Step Search,NTSS)
    • 四步搜索(Four Step Search,FSS)
    • 共轭方向搜索(Conjugate Direction Search,CDS)
    • 梯度下降搜索(Gradient Descent Search,GDS)
    • 层次块搜索(Hierarchical Block Matching Algorithm,HBMA)

12. 三步搜索

  • 由粗到精搜索最优点,初始步长为R/2.
  • 第一步:检查起始点和其周围步长为R/2的8个点,将最优点作为第二步的起始点;
  • 第二步:以新的起始点为中心检查其周围步长为R/4的8个点,找到最优点作为第三步的起始点;
  • 第三步:以新的起始点为中心检查其周围步长为R/8的8个点,找到最优点,如果R/8=1则搜索终止,最优点位置的预测块作为最优的预测块,否则重复该过程直到R/n2=1;
  • 三步搜索方法检查点的个数为1+8log2(d+1),当d=8时,检查点个数为9+8+8=25

13. 二维Log搜索

  • 每一步采用十字搜索模式
  • 如果每一步的最优点为中心点或者搜索窗的边界点,搜索步长减半,否则搜索步长不变
  • 当搜索步长为1时,中心点周围的8个点都要检查
  • 两个搜索路径一个需要5+3+3+8=19,另外一个需要5+3+2+3+2+8=23

14. 正交搜索

  • 起始搜索步长R/2,从起始点开始水平搜索三个点,得到最优点并沿着最优点垂直方向搜索相邻的两个点,得到最优点,以搜索步长为R/4再以同样的方式先水平再垂直搜索,当步长为1时停止搜索
  • 搜索方法检查点的个数为1+4log2(d+1),当d=8时,检查点个数为3+2+2+2+2+2=13。

15. 十字搜索

  • 起始搜索步长R/2,从起始点开始以"X"形十字搜索,当搜索步长降为1时,如果上一步的最优点为中心点,左上点或右下点,则这一步搜索以"+"形状十字搜索,然后结束搜索,否则还是以"X"形十字搜索,然后结束搜索。
  • 十字搜索方法检查点的个数为1+4log22d,当d=8时,检查点个数为5+4+4+4=17

16. 新三步搜索

  • 与三步搜索方法不同的是,考虑到运动矢量高的中心分布特点,新三步搜索方法,除了围绕起始点为中心搜索步长为R/2的8个点之外,在起始点周围增加了步长为1的8个搜索点,如果最优点为步长为1的8个搜索点之一,则在最优点邻近的三个点中搜索最优点,然后结束搜索,否则,和三步搜索方法过程一样
  • 其中一个搜索路径需要检查点个数为17+3=20,另一个需要17+8+8=33。

17. 块梯度下降搜索

  • 该方法以起始点为中心搜索8个步长为1的相邻点,确定最优点,再以最优点为中心搜索8个步长为1的相邻点,如此循环下去,不限制搜索步骤,但当搜索得到的最优点为中心点或者到搜索窗的边界,搜索终止。

18. 层次块搜索

  • 对编码图像和参考图像下采样,分别得到编码图像和参考图像的下采样图像,未经采样处理的编码图像和参考图像属于第0层,一次下采样的编码图像和参考图像属于第1层,对第1层图像再进行下采样得到的编码图像和参考图像属于第2层,依次重复上述过程,得到第n层下采样的编码图像和参考图像。
  • 然后在n层下采样参考图像的搜索范围中找到与下采样编码图像块最佳匹配块的MV,该MV作为n-1层的运动估计搜索范围的中心点,依次重复上述过程,直到n=0为止,此时得到的最佳匹配块就是编码图像的预测块,其对应的MV为最终的最优MV。

19. 搜索算法复杂度比较

20. 分像素运动估计与运动补偿

  • 时域运动位置更可能在整象素之间,即分像素上。
  • 利用相邻的整象素可以估计出分象素的值
    • 常用线性或双线性插值得到分象素的值。
  • 分象素运动估计有更高的预测精度,但复杂度也更高,
    • 1/2分象素运动估计,图像存储空间增加4倍,运动矢量需要放大2倍,1/4分象素运动估计,图像存储空间增加16倍,运动矢量需要放大4倍,计算复杂度也成倍增加。

21. 分像素插值

22. 多参考帧预测

  • 有更多的候选图像,搜索更精确的预测块
  • 需要更多的参考图像存储空间
  • 码流需要标识参考帧索引的语法元素

23. 图像分块编码

  • 视频内容的运动非常复杂,图像分块编码可以更好的提高运动预测精度,提高压缩效率。
  • 要在编码块大小和附信息(MV,Mode)编码比特数之间权衡,小的编码块大小会有更好的预测但有更多的附信息比特数。

23. 双向预测编码

24. B帧有更好的编码效率

  • B帧有更好的编码效率

    • 新出现的对象参考将来的帧有更好的预测效果
    • 前后两个预测的平均值可以减少预测方差

25. 全局运动估计

  • 基于全局仿射运动模型
  • 预测精度不如基于块的运动估计
  • MV数目少,适合简单运动场景的运动估计

时间: 2024-10-07 09:09:12

二:编解码框架的相关文章

视频编解码学习之二:编解码框架

第四章 视频编码基础 1. 压缩码流 语法:码流中各个元素的位置关系 01001001… 图像编码类型(01),宏块类型(00),编码系数1001等 语义:每个语法元素所表达的意义. 例如:图像编码类型 2. 编码层次 序列(Sequence) 图像组(Group of Pictures,GOP) 图像(Picture) 条带(Slice) 宏块(Macroblock,MB) 块(Block) 3. 码流结构 3. PB帧编码 4. 序列编码对象 (1)IBBP序列 序列:一段连续编码的并具有相

Netty编解码框架分析

1. 背景 1.1. 编解码技术 通常我们也习惯将编码(Encode)称为序列化(serialization),它将对象序列化为字节数组,用于网络传输.数据持久化或者其它用途. 反之,解码(Decode)/反序列化(deserialization)把从网络.磁盘等读取的字节数组还原成原始对象(通常是原始对象的拷贝),以方便后续的业务逻辑操作. 进行远程跨进程服务调用时(例如RPC调用),需要使用特定的编解码技术,对需要进行网络传输的对象做编码或者解码,以便完成远程调用. 1.2. 常用的编解码框

【转】Netty系列之Netty编解码框架分析

http://www.infoq.com/cn/articles/netty-codec-framework-analyse/ 1. 背景 1.1. 编解码技术 通常我们也习惯将编码(Encode)称为序列化(serialization),它将对象序列化为字节数组,用于网络传输.数据持久化或者其它用途. 反之,解码(Decode)/反序列化(deserialization)把从网络.磁盘等读取的字节数组还原成原始对象(通常是原始对象的拷贝),以方便后续的业务逻辑操作. 进行远程跨进程服务调用时(

H264 编解码框架简单介绍

阅读完H264/AVC 编解码器的介绍,脑海中仅仅是留下下面三条: 1.H264并没有明白规定一个编解码器怎样实现,仅仅是规定了一个编码后的视频比特流的句法,和该比特流的解码方法,这个与MPEG 类似. 2.H264和曾经的标准(如H261.H263.MPEG-1.MPEG-4)的编解码器实现流程没有太大差别,基本的不同在于各功能块的细节. 3.H264就是利用实现的复杂性获得压缩性能的明显改善.(至于复杂度的评估,以后会介绍) 以下介绍一下H264的编码器框图: 编码器採用的仍是变换和预測的混

Netty 编解码技术 数据通信和心跳监控案例

Netty 编解码技术 数据通信和心跳监控案例 多台服务器之间在进行跨进程服务调用时,需要使用特定的编解码技术,对需要进行网络传输的对象做编码和解码操作,以便完成远程调用.Netty提供了完善,易扩展,易使用的编解码技术.本章除了介绍Marshalling的使用,还会基于编解码技术实现数据通信和心跳检测案例.通过本章,你将学到Java序列化的优缺点,主流编解码框架的特点,模拟特殊长连接通信,心跳监控案例.还在等什么,丰满的知识等你来拿! 技术:编解码,数据通信,心跳监控 说明:github上有完

MessagePack编解码技术介绍与使用

[toc] MessagePack编解码技术介绍与使用 编解码技术介绍 Java中本身技术序列化技术,即使用ObjectInputStream和ObjectOutputStream即可完成对象的序列化和反序列化,目的主要有如下: 对象持久化存储 网络传输 当然,因为最近学习主要是学习Netty,所以这里更多是出于网络传输的目的,所以对于编解码的基本解释,可如下: 编码:将Java对象转化为字节数组或ByteBuffer对象: 解码:将字节数组或ByteBuffer对象转化为Java对象: 当然因

Netty入门系列(3) --使用Netty进行编解码的操作

前言 何为编解码,通俗的来说,我们需要将一串文本信息从A发送到B并且将这段文本进行加工处理,如:A将信息文本信息编码为2进制信息进行传输.B接受到的消息是一串2进制信息,需要将其解码为文本信息才能正常进行处理. 上章我们介绍的Netty如何解决拆包和粘包问题,就是运用了解码的这一功能. java默认的序列化机制 使用Netty大多是java程序猿,我们基于一切都是对象的原则,经常会将对象进行网络传输,那么对于序列化操作肯定大家都是非常熟悉的. 一个对象是不能直接进行网络I/O传输的,jdk默认是

Thrift源码分析(二)-- 协议和编解码

协议和编解码是一个网络应用程序的核心问题之一,客户端和服务器通过约定的协议来传输消息(数据),通过特定的格式来编解码字节流,并转化成业务消息,提供给上层框架调用. Thrift的协议比较简单,它把协议和编解码整合在了一起.抽象类TProtocol定义了协议和编解码的顶层接口.个人感觉采用抽象类而不是接口的方式来定义顶层接口并不好,TProtocol关联了一个TTransport传输对象,而不是提供一个类似getTransport()的接口,导致抽象类的扩展性比接口差. TProtocol主要做了

一个简单RPC框架是如何炼成的(IV)——实现RPC消息的编解码

之前我们制定了一个很简单的RPC消息 的格式,但是还遗留了两个问题,上一篇解决掉了一个,还留下一个 我们并没有实现相应的encode和decode方法,没有基于可以跨设备的字符串传输,而是直接的内存变量传递. 现在的RPC request不支持带参数的请求命令.如add(a, b), 如何在RPC消息中描述参数a,b . 下面我们处理掉这个编解码问题. 实际的RPC应用基本都是跨机器连接,所以无法直接传递内存变量,也就是说还需要将消息编码成 诸如字符串一类的可以跨设备传输的内容.具体的RPC消息