热门标签 | HotTags
当前位置:  开发笔记 > 编程语言 > 正文

3视频编解码基础

视频编解码基础.md视频编解码算法分为传统算法和基于深度学习的方法,本文主要介绍视频编解码技术的原理,部分内容和图片参考网上技术博客(链接




视频编解码基础.md

视频编解码算法分为传统算法和基于深度学习的方法,本文主要介绍视频编解码技术的原理,部分内容和图片参考网上技术博客(链接已放在文章末尾)。



毕设项目演示地址: 链接


毕业项目设计代做项目方向涵盖:

基于Python设计,OpenCV,SSD,CNN,机器学习,CNN,SVM,BP神经网络,数字识别,贝叶斯,逻辑回归,卷积神经网络等算法的中文文本分类.车牌识别,知识图谱,数字图像处理,手势识别,边缘检测,图像增强,图像分类,图像分割,色彩增强,低照度。缺陷检测,病害识别,图像缺陷检测,裂缝识别,交通标志识别,夜间车牌识别,人数统计,火焰烟雾火,车道线识别,人脸识别系统


一,基本术语



数字图像的定义及理解可以参考这篇文章:数字图像处理笔记|一文搞懂数字图像基础。



  1. 颜色深度:存储每个像素颜色的强度,需要占用一定大小的数据空间,这个空间大小即为颜色深度,对于 RGB 色彩模型,颜色深度是 24 (8*3)bit。
  2. 图片分辨率:图像的像素的数量,通常表示为宽*高。
  3. 图像/视频宽高比:单地描述了图像或像素的宽度和高度之间的比例关系。
  4. 比特率:播放一段视频每秒所需的数据量,比特率 = 宽 * 高 * 颜色深度 * 帧每秒。例如,一段每秒 30 帧,每像素 24 bits,分辨率是 480x240 的视频,如果我们不做任何压缩,它将需要 82,944,000 比特每秒或 82.944 Mbps (30x480x240x24)。当比特率几乎恒定时称为恒定比特率(CBR);但它也可以变化,称为可变比特率(VBR)。

下面这个图形显示了一个受限的 VBR,当帧为黑色时不会花费太多的数据量。

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-tVZ55qSq-1665413905136)(…/…/data/images/视频编解码基础/-jXLfV_qr2zM85N4PM96IDx1SHVeBYIi4_mt7QyposI.png)]


1.1,颜色亮度和我们的眼睛



因为人眼睛的视杆细胞(亮度)比视锥细胞多很多,所以一个合理的推断是相比颜色,我们有更好的能力去区分黑暗和光亮。


我们的眼睛对亮度比对颜色更敏感,可以看看下面的图片来测试。

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-YI9Xexoz-1665413905140)(…/…/data/images/视频编解码基础/QWcQX5JHyaXT8cSps_T9IDNQlBaFEdkizVLj6PoPVKE.png)]

看不出左图的方块 A 和方块 B 的颜色是相同的,那是因为我们的大脑玩了一个小把戏,这让我们更多的去注意光与暗,而不是颜色。右边这里有一个使用同样颜色的连接器,那么我们(的大脑)就能轻易分辨出事实,它们是同样的颜色。


二,视频编码的实现原理


2.1,视频编码技术概述

编码的目的是为了压缩,所谓编码算法,就是寻找规律构建一个高效模型,将视频数据中的冗余信息去除。

常见的视频的冗余信息和对应的压缩方法如下表:


种类内容压缩方法
空间冗余像素间的相关性变换编码,预测编码
时间冗余时间方向上的相关性帧间预测,运动补偿
图像构造冗余图像本身的构造轮廓编码,区域分割
知识冗余收发两端对人物共有认识基于知识的编码
视觉冗余人对视觉特性非线性量化,位分配
其他不确定性因素

视频帧冗余信息示例如下图所示:

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-CwRUAHaM-1665413905141)(…/…/data/images/视频编解码基础/M2CqfRSBj_lRBdg3qi865_mM1iGWgo6GqF6eRPwHkd0.png)]


2.2,帧类型

我们知道视频是由不同的帧画面连续播放形成的,视频的帧主要分为三类,分别是(1)I 帧;(2)B 帧;(3)P 帧。


  • I 帧(关键帧,帧内编码):是自带全部信息的独立帧,是最完整的画面(占用的空间最大),无需参考其它图像便可独立进行解码。视频序列中的第一个帧,始终都是I帧
  • P 帧(预测):“帧间预测编码帧”,需要参考前面的I帧和/或P帧的不同部分,才能进行编码。P帧对前面的P和I参考帧有依赖性。但是,P帧压缩率比较高,占用的空间较小。
  • B 帧(双向预测):“双向预测编码帧”,以前帧后帧作为参考帧。不仅参考前面,还参考后面的帧,所以,它的压缩率最高,可以达到200:1。不过,因为依赖后面的帧,所以不适合实时传输(例如视频会议)。

对 I 帧的处理,是采用帧内编码(帧间预测)方式,只利用本帧图像内的空间相关性

对 P 帧的处理,采用帧间编码(前向运动估计),同时利用空间和时间上的相关性。简单来说,采用运动补偿(motion compensation)算法来去掉冗余信息。

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-Y3cyVAF1-1665413905153)(…/…/data/images/视频编解码基础/I帧和P帧的处理.png)]


2.3,帧内编码(帧内预测)

帧内编码/预测用于解决单帧空间冗余问题。如果我们分析视频的每一帧,会发现许多区域是相互关联的

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-xUz4tyOn-1665413905155)(…/…/data/images/视频编解码基础/jgLT106FPhGEnBm2dW2ZuA_7_REfRxJc5EBf9TCaHJA.png)]

举个例子来理解帧内编码,如下图所示的图片,可以看出这个图大部分区域颜色是一样的。假设这是一个 I 帧 ,我们即将编码红色区域,假设帧中的颜色在垂直方向上保持一致,这意味着未知像素的颜色与临近的像素相同

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-XwwGFT3a-1665413905171)(…/…/data/images/视频编解码基础/RAfLbaiYaFqhMQXVO90zp5hL1dIPriJgFMFuOVO5h_c.png)]

这样的先验预测虽然会出错,但是我们可以先利用这项技术(帧内预测),然后减去实际值,算出残差,这样得出的残差矩阵比原始数据更容易压缩。

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-GsYBkHvu-1665413905175)(…/…/data/images/视频编解码基础/ppV85jK13JFn0zJHlADmfXWlz5lqcUEuYtFH2gTm4L8.png)]


2.4,帧间编码(帧间预测)

视频帧在时间上的重复,解决这类冗余的技术就是帧间编码/预测。

尝试花费较少的数据量去编码在时间上连续的 0 号帧和 1 号帧。比如做个减法,简单地用 0 号帧减去 1 号帧,得到残差,这样我们就只需要对残差进行编码

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-tD4fSAbY-1665413905177)(…/…/data/images/视频编解码基础/oJ9e60nLgn-OVbbx7haL8hBhnrF0YqhwqIgwsWkKYSU.png)]
[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-jAoaGcVe-1665413905180)(…/…/data/images/视频编解码基础/KHA1uyXNRhYth4zTmuTr07LbI-EJHhx7P-YNsOciTiA.png)]

做减法的方法比较简单粗暴,效果不是很好,可以有更好的方法来节省数据量。首先,我们将0 号帧 视为一个个分块的集合,然后我们将尝试将 帧 1帧 0 上的块相匹配。我们可以将这看作是运动预测



运动补偿是一种描述相邻帧(相邻在这里表示在编码关系上相邻,在播放顺序上两帧未必相邻)差别的方法,具体来说是描述前面一帧(相邻在这里表示在编码关系上的前面,在播放顺序上未必在当前帧前面)的每个小块怎样移动到当前帧中的某个位置去。”


[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-91wakFzo-1665413905183)(…/…/data/images/视频编解码基础/JX3nTuItuYQTirDYMNtJ7X6F323W4RJpxEhFai7NSus.png)]

如上图所示,我们预计球会从 x=0, y=25 移动到 x=7, y=26,xy 的值就是运动向量进一步节省数据量的方法是,只编码这两者运动向量的差。所以,最终运动向量就是 x=7 (6-0), y=1 (26-25)。使用运动预测的方法会找不到完美匹配的块,但使用运动预测时,编码的数据量少于使用简单的残差帧技术,对比图如下图所示:

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-GFq46vHl-1665413905186)(…/…/data/images/视频编解码基础/HzgxxQWKdq7WCEV0p5BwuZUi_ndWAKjlNety-jAg7Nk.png)]


三,实际的视频编码器如何工作


3.1,视频容器(视频数据封装)

首先视频编码器和视频容器是不一样的,我们常见的各种视频文件名后缀:.mp4.mkv.avi.mpeg 等其实都是视频容器。视频容器定义:将已经编码压缩好的视频轨和音频轨按照一定的格式放到一个文件中,这个特定的文件类型即为视频容器。


3.2,编码器发展历史

视频编码器的发展历史见下图:

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-Fsmk1WWo-1665413905188)(…/…/data/images/视频编解码基础/V1hLa9oiPCvkvXIhUNK3K9BYs-qtP45t1J_2CERwNzk.png)]


3.3,通用编码器工作流程

虽然视频编码器的已经经历了几十年的发展历史,但是其还是有一个主要的工作机制的。


3.3.1,第一步-图片分区

第一步是将帧分成几个分区,子分区甚至更多。分区的目的是为了更精确的处理预测,在微小移动的部分使用较小的分区,而在静态背景上使用较大的分区。

通常,编解码器将这些分区组织成切片(或瓦片),宏(或编码树单元)和许多子分区。这些分区的最大大小对于不同的编码器有所不同,比如 HEVC 设置成 64x64,而 AVC 使用 16x16,但子分区可以达到 4x4 的大小。

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-8yoC4Gkb-1665413905189)(…/…/data/images/视频编解码基础/C1VBAUffMEOBvu2eH2Hv5e6vrZn7BWXlYq1_f_PBCHc.png)]


3.3.2,第二步-预测

有了分区,我们就可以在它们之上做出预测。对于帧间预测,我们需要发送运动向量和残差;至于帧内预测,我们需要发送预测方向和残差


3.3.3,第三步-转换

在我们得到残差块(预测分区-真实分区)之后,我们可以用一种方式变换它,这样我们就知道哪些像素我们应该丢弃,还依然能保持整体质量。这个确切的行为有几种变换方式,这里只介绍离散余弦变换(DCT),其功能如下:


  • 像素转换为相同大小的频率系数块
  • 压缩能量,更容易消除空间冗余。
  • 可逆的,也意味着你可以还原回像素。

我们知道在一张图像中,大多数能量会集中在低频部分,所以如果我们将图像转换成频率系数,并丢掉高频系数,我们就能减少描述图像所需的数据量,而不会牺牲太多的图像质量。 DCT 可以把原始图像转换为频率(系数块),然后丢掉最不重要的系数。

我们从丢掉不重要系数后的系数块重构图像,并与原始图像做对比,如下图所示。

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-fMRJf6OQ-1665413905196)(…/…/data/images/视频编解码基础/IK93nKGvFbaMz6z2VgUdy2SY5HXkGLkaAeMJaWvh7Fw.png)]

可以看出它酷似原图像,与原图相比,我们丢弃了67.1875%,而如何智能的选择丢弃系数则是下一步要考虑的问题。


3.3.4,第四步-量化

当我们丢掉一些(频率)系数块时,在最后一步(变换),我们做了一些形式的量化。这一步,我们选择性地剔除信息(有损部分)或者简单来说,我们将量化系数以实现压缩

如何量化一个系数块?一个简单的方法是均匀量化,我们取一个块并将其除以单个的值(10),并舍入值。

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-0QQKBIiw-1665413905197)(…/…/data/images/视频编解码基础/-X6f0NrOVosxjTIhMDsxi7v43Yq6BqDZ3pESu_3W0vw.png)]

那如何逆转(反量化)这个系数块呢?可以通过乘以我们先前除以的相同的值(10)来做到。

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-7WzKRwtG-1665413905197)(…/…/data/images/视频编解码基础/pY2BO3_tCwZgCcg-LKdjVgnEjBZo0aU4NCfJIu7K0G8.png)]

均匀量化并不是一个最好的量化方案,因为其并没有考虑到每个系数的重要性,我们可以使用一个量化矩阵来代替单个值,这个矩阵可以利用 DCT 的属性,多量化右下部,而少(量化)左上部,JPEG 使用了类似的方法,我们可以通过查看源码看看这个矩阵。


3.3.5,第五步-熵编码

在我们量化数据(图像块/切片/帧)之后,我们仍然可以以无损的方式来压缩它。有许多方法(算法)可用来压缩数据:


  1. VLC 编码
  2. 算术编码

3.3.6,第六步-比特流格式

完成上述步骤,即已经完成视频数据的编码压缩,后续我们需要将压缩过的帧和内容打包进去。需要明确告知解码器编码定义,如颜色深度,颜色空间,分辨率,预测信息(运动向量,帧内预测方向),档次*,级别*,帧率,帧类型,帧号等等更多信息。


参考资料


  1. digital_video_introduction
  2. 零基础,史上最通俗视频编码技术入门






推荐阅读
  • 移动传感器扫描覆盖摘要:关于传感器网络中的地址覆盖问题,已经做过很多尝试。他们通常归为两类,全覆盖和栅栏覆盖,统称为静态覆盖 ... [详细]
  • CSS3选择器的使用方法详解,提高Web开发效率和精准度
    本文详细介绍了CSS3新增的选择器方法,包括属性选择器的使用。通过CSS3选择器,可以提高Web开发的效率和精准度,使得查找元素更加方便和快捷。同时,本文还对属性选择器的各种用法进行了详细解释,并给出了相应的代码示例。通过学习本文,读者可以更好地掌握CSS3选择器的使用方法,提升自己的Web开发能力。 ... [详细]
  • 生成式对抗网络模型综述摘要生成式对抗网络模型(GAN)是基于深度学习的一种强大的生成模型,可以应用于计算机视觉、自然语言处理、半监督学习等重要领域。生成式对抗网络 ... [详细]
  • 在Android开发中,使用Picasso库可以实现对网络图片的等比例缩放。本文介绍了使用Picasso库进行图片缩放的方法,并提供了具体的代码实现。通过获取图片的宽高,计算目标宽度和高度,并创建新图实现等比例缩放。 ... [详细]
  • sklearn数据集库中的常用数据集类型介绍
    本文介绍了sklearn数据集库中常用的数据集类型,包括玩具数据集和样本生成器。其中详细介绍了波士顿房价数据集,包含了波士顿506处房屋的13种不同特征以及房屋价格,适用于回归任务。 ... [详细]
  • 集成电路企业在进行跨隔离网数据交换时面临着安全性问题,传统的数据交换方式存在安全性堪忧、效率低下等问题。本文以《Ftrans跨网文件安全交换系统》为例,介绍了如何通过丰富的审批流程来满足企业的合规要求,保障数据交换的安全性。 ... [详细]
  • 本文讨论了编写可保护的代码的重要性,包括提高代码的可读性、可调试性和直观性。同时介绍了优化代码的方法,如代码格式化、解释函数和提炼函数等。还提到了一些常见的坏代码味道,如不规范的命名、重复代码、过长的函数和参数列表等。最后,介绍了如何处理数据泥团和进行函数重构,以提高代码质量和可维护性。 ... [详细]
  • 本文由编程笔记#小编整理,主要介绍了关于数论相关的知识,包括数论的算法和百度百科的链接。文章还介绍了欧几里得算法、辗转相除法、gcd、lcm和扩展欧几里得算法的使用方法。此外,文章还提到了数论在求解不定方程、模线性方程和乘法逆元方面的应用。摘要长度:184字。 ... [详细]
  • 本文介绍了如何使用JSONObiect和Gson相关方法实现json数据与kotlin对象的相互转换。首先解释了JSON的概念和数据格式,然后详细介绍了相关API,包括JSONObject和Gson的使用方法。接着讲解了如何将json格式的字符串转换为kotlin对象或List,以及如何将kotlin对象转换为json字符串。最后提到了使用Map封装json对象的特殊情况。文章还对JSON和XML进行了比较,指出了JSON的优势和缺点。 ... [详细]
  • JavaScript和HTML之间的交互是经由过程事宜完成的。事宜:文档或浏览器窗口中发作的一些特定的交互霎时。能够运用侦听器(或处置惩罚递次来预订事宜),以便事宜发作时实行相应的 ... [详细]
  • Java 11相对于Java 8,OptaPlanner性能提升有多大?
    本文通过基准测试比较了Java 11和Java 8对OptaPlanner的性能提升。测试结果表明,在相同的硬件环境下,Java 11相对于Java 8在垃圾回收方面表现更好,从而提升了OptaPlanner的性能。 ... [详细]
  • 背景应用安全领域,各类攻击长久以来都危害着互联网上的应用,在web应用安全风险中,各类注入、跨站等攻击仍然占据着较前的位置。WAF(Web应用防火墙)正是为防御和阻断这类攻击而存在 ... [详细]
  • 概述H.323是由ITU制定的通信控制协议,用于在分组交换网中提供多媒体业务。呼叫控制是其中的重要组成部分,它可用来建立点到点的媒体会话和多点间媒体会议 ... [详细]
  • Opencv提供了几种分类器,例程里通过字符识别来进行说明的1、支持向量机(SVM):给定训练样本,支持向量机建立一个超平面作为决策平面,使得正例和反例之间的隔离边缘被最大化。函数原型:训练原型cv ... [详细]
  • vb6集成ad登录共享文件_SCSP实验2单点登录
    01—实验目的掌握单点登陆相关原理和深信服配置02—实验环境1.AC版本v12.0.42AC1地址:https:172.172.1.1AC2地址:htt ... [详细]
author-avatar
521壮壮妈_386
这个家伙很懒,什么也没留下!
PHP1.CN | 中国最专业的PHP中文社区 | DevBox开发工具箱 | json解析格式化 |PHP资讯 | PHP教程 | 数据库技术 | 服务器技术 | 前端开发技术 | PHP框架 | 开发工具 | 在线工具
Copyright © 1998 - 2020 PHP1.CN. All Rights Reserved | 京公网安备 11010802041100号 | 京ICP备19059560号-4 | PHP1.CN 第一PHP社区 版权所有