视频编解码基本流程

视频编解码基本流程视频编解码基本框架

大家好,又见面了,我是你们的朋友全栈君。

本文简要概述视频编解码中的基本流程。具体表现为下图的过程:

视频编解码基本流程

 编码流程:

(1)预测:视频由按照时间序列的图像构成。每一幅图像相邻像素之间存在较强的空间相关性,而相邻图像(不同时间)之间存在时间上的相关性。充分利用这些信息,可以有效的帮助我们去除这些冗余信息。根据空间和时间相关性,存在帧内预测和帧间预测两种不同的方式。两者都需要根据已编码的像素去预测未编码像素。通常选取第一帧作为参考帧,而不进行处理。通过帧内/帧间预测的方式,我们可以将预测值和真实值的残差进行编码操作。下面逐一介绍帧内预测和帧间预测的方法:

(a) 帧内预测:该预测值来自于周围已编码结果的线性组合。由于图像中存在特定的纹理,因此该预测值的计算存在几种不同的模式,例如:垂直模式,水平模式,DC模式,Plane 模式等。在实际中我们需要扫描所有的模式从而通过拉格朗日率失真优化进行选择。具体为计算

J=D+\lambda\cdot R

其中变量 D 表示失真的大小,而变量 R 表示其他的影响因素。我们需要综合考虑代价函数,而不仅仅只是残差的大小。

(b)帧间预测:主要采用基于块的运动补偿技术。该技术通过相邻图像高度的时间相关性,可以为当前图像中的每一个像素寻找之前已经编码图像的一个最佳匹配块(运动估计),用参考像素块和当前像素块,可以定义一个运动矢量。类似于帧内预测,这里我们也只需要传输运动矢量的残差。在运动补偿过程中,我们也需要对块的划分进行遍历,利用最小均方误差或者最小平均绝对误差等对运动矢量残差进行估计,计算拉格朗日率失真优化,从而选择最优的运动矢量,进而将运动矢量残差传递到后续的编码过程中。

(2)变换编码:视频图像中存在较多变化比较缓慢的区域,因此我们可以通过适当的变换将图像数据集中在某一个区域,然后针对变换后的区域进行量化等编码操作。常用的变换方法包括:离散余弦/正弦变换。对于一个周期性函数,我们可以将其按照三角函数进行傅立叶展开。对于某些特殊情况,如函数具有明确的奇偶性,我们可以只使用正弦函数或余弦函数。对于周期性函数,结果可表示为一系列特定频谱的信号,当函数不具有周期性时,傅立叶展开表现为一个连续频谱的叠加。当输入为离散信号时,我们需采用离散的正弦/余弦变换。因此傅立叶变换本质上是将信号分解为特定波形的叠加,从而简化分析。

(3)量化:经过变换编码之后需要进行量化处理。基本思想为将连续或者大量离散的数值映射到有限几个离散数值的过程,即多对一的映射关系。量化过程将丢失信号,是有损压缩。这种映射关系不唯一,存在多种选择。具体采用哪种方案可根据均方误差,信噪比,峰值信噪比进行估计。

(4)滤波:在基于块的混合编码框架下,视频压缩过程中会存在方块效应,振玲效应,颜色偏差等失真行为。为了降低编码过程中这些失真对视频质量的影响,我们需要滤波技术,包括去方块滤波以及像素自适应补偿技术。

(a)去方块滤波:基于块的编码技术中,各个块的变换量化过程相对独立,从而导致量化过程中产生的误差以及分布也具有独立性质,因此导致编码块的边界不连续,产生方块效应。环路去方块滤波技术可以有效地降低、去除这种不连续行为。

(b)自适应补偿技术:

(5)熵编码:熵编码是一种无损编码方式。将视频序列信息转换为用来传输或存储的压缩码流。

版权声明:本文内容由互联网用户自发贡献,该文观点仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请联系我们举报,一经查实,本站将立刻删除。

发布者:全栈程序员-站长,转载请注明出处:https://javaforall.net/158688.html原文链接:https://javaforall.net

(0)
上一篇 2022年7月13日 下午9:00
下一篇 2022年7月13日 下午9:00


相关推荐

  • android游戏开发引擎_android主题引擎

    android游戏开发引擎_android主题引擎随着Android系统的使用越来越广泛,了解一下Android平台下的游戏引擎就非常有必要。而同时因为基于Intelx86的移动设备越来越多,我也非常关注支持x86的移动游戏引擎。然而就目前为止游戏引擎的数量已经非常之多,每个引擎都有不同的特征、价格、成熟度等。通过一些调研之后,我发现有非常多的游戏引擎可用于开发运行在android移动设备端的游戏,其中有些还支持x86系统,另外还有些通过简单的

    2025年8月15日
    4
  • openjdk使用_深入地理解

    openjdk使用_深入地理解目录前言一、从JDK源码看双亲委派二、使用步骤1.引入库2.读入数据总结前言关于JVM类加载的基础理论知识,请参照《深入理解Java虚拟机》读书笔记(六)–虚拟机类加载机制(上)和《深入理解Java虚拟机》读书笔记(六)–虚拟机类加载机制(下)。一、从JDK源码看双亲委派注:博主是使用的是openjdk8,换了新电脑还没有去编译源码,所以看的是静态代码,关于如何编译和调试源码,网上不少文章都有介绍,这里就不赘述了我们都知道在Java类加载中,除了BootStrap加载器,App和Ext加载

    2022年8月11日
    6
  • DynamnicQuery for BAQ

    DynamnicQuery for BAQ文章转自:https://pastebin.com/9CsF6uEC//DynamnicQueryforBAQ    Epicor.Mfg.Core.SessionepiSession=default(Epicor.Mfg.Core.Session);    epiSession=(Epicor.Mfg.Core.Session)POEntryFor

    2022年6月16日
    27
  • Grok 3国内怎么用?超详细使用指南+实用指令模板

    Grok 3国内怎么用?超详细使用指南+实用指令模板

    2026年3月15日
    1
  • myeclipse免费版下载_Myeclipse

    myeclipse免费版下载_Myeclipse
     占奇发布于:2011年03月21日(40评)

    MyEclipse9.0经过M1,M2,终于出了正式版(MyEclipseForSpring还是8.6.1)。该版本集成了Eclipse3.6.1,支持HTML5和JavaEE6
    标准版各平台下载地址:官网支持功能自定义下载安装
     
    MyEclipse9.0forWindows下载
    MyEclipse9.0(Wind

    2026年4月14日
    5
  • Gitkraken收费解法办法

    Gitkraken收费解法办法Gitkraken 好像是从 6 5 5 开始收费的 最新下载的 gitkraken 都是 7 0 1 版本 直接用回老版本就可以了 我直接下载的 6 5 0 版本 下载链接在最后 步骤 下载安装即可创建快捷方式直接走开始目录打开 Gitkraken 时 默认是通过 C Users xxx AppData Local gitkraken Update exe 来打开的 它每次都自动更新到最新的版本 所以下载老版本也是白瞎了 在目录 C Users xxx AppData Local gitkraken 有个文

    2026年3月18日
    1

发表回复

您的邮箱地址不会被公开。 必填项已用 * 标注

关注全栈程序员社区公众号