视频编解码基本流程

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

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

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

视频编解码基本流程

 编码流程:

(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)
全栈程序员-站长的头像全栈程序员-站长


相关推荐

  • pycharm安装教程2021.2_pycharm和anaconda结合安装

    pycharm安装教程2021.2_pycharm和anaconda结合安装PyCharm2021.3&Anaconda安装教程

    2022年8月26日
    8
  • tcptraceroute与traceroute

    tcptraceroute与traceroute1traceroute功能说明:显示数据包到主机间的路径。它默认发送的数据包大小是40字节。通过traceroute我们可以知道信息从你的计算机到互联网另一端的主机是走的什么路径。当然每次数据包由某一同样的出发点(source)到达某一同样的目的地(destination)走的路径可能会不一样,但基本上来说大部分时候所走的路由是相同的。工作原理Traceroute程序的…

    2022年6月20日
    27
  • 滴滴回应乐清顺风车乘客遇害事件:深感自责与愧疚

    滴滴回应乐清顺风车乘客遇害事件:深感自责与愧疚

    2021年6月11日
    264
  • 【已解决】Redis连接——Could not connect to Redis at 127.0.0.1:6379: Connection refused[通俗易懂]

    【已解决】Redis连接——Could not connect to Redis at 127.0.0.1:6379: Connection refused[通俗易懂]相信很多人很可能刚上手使用Redis时,很容易遇到的问题就是CouldnotconnecttoRedisat127.0.0.1:6379:Connectionrefused。由于只是记录bug解决,所以开门见山,宜春不多哔哔…其实原因很简单,这个问题一般是关闭了服务端导致客户端打不开,最简单快捷解决办法就是先开启服务端,再去连接客户端!如下:开启服务端需要先配置(redis.con…

    2022年6月6日
    1.1K
  • 苹果手机数据转移到新手机_旧手机数据转移到新手机,一键免费传输

    苹果手机数据转移到新手机_旧手机数据转移到新手机,一键免费传输这款软件所有人都能用到建议收藏备用当我们换新手机时是不是很多数据需要转移很繁琐费劲电话号短信备注等等都想留着解决办法来了!!!今天推送的这款神器是腾讯旗下唯一一款零差评的app这款软件真正解决了我们平时更换手机遇到的所有痛点,没有GG无需会员软件名字:换机助手(适用于安卓iOS)01软件介绍现在随着互联网的发展,智能手机几乎人手必备,而且大家更换手机的频率越来越高,更换手机时候,…

    2022年5月24日
    59
  • 代理模式proxy_反向代理是什么

    代理模式proxy_反向代理是什么代理模式 Proxy动机模式定义实例结构要点总结笔记动机在面向对象系统中,由于某种原因(比如对象创建的开销很大,或者某些操作需要安全控制,或者需要进程额外的访问等),直接访问会给使用者,或者系统结构带来很多麻烦.如何在不是去透明操作对象的同时来管理/控制这些对象特有的复杂性?增加一层间接曾是软件开发中常见的解决方式模式定义为其他对象提供一种代理以控制(隔离,使用接口)对这个对象的访问实例朴素客户端要去使用process 但是process周围需要做很多事情class ISubject{p

    2022年8月9日
    7

发表回复

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

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