如何给小白解释什么是编解码器

Posted LiveVideoStack_

tags:

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

点击上方“LiveVideoStack”关注我们

翻译 | Alex

技术审校 | 章琦

本文来自OTTVerse,作者为Krishna Rao Vijayanagar。

编解码器

Easy Tech

#005#

在本篇文章中,我们将学习视频编解码器、视频编码标准以及在数据压缩和解压缩的过程中,视频编码标准是如何发挥作用的。

在前面介绍数据压缩的文章中,我们已经证实,数据预测对于减少数据体积而言至关重要。

在预测的过程中,为了向另一端传达压缩信息的含义和句法,我们最终设计了一门“语言”。这种语言的设计很微妙,我们在本篇文章中将重点说明。

数据压缩和创造语言

为了理解视频编解码器,我将请你传送下列英语字母序列给你的朋友。但是,有限制条件:我们手边的系统比较落后,它要用1字节的空间存储一个字母或数字。

数据:

<data>
    A A A A A A A A A A A A A A A A A A A A B
</data>

注意:直接告诉你,这里有20个A和1个B(担心你数不清楚),你要怎么做呢?

答案:我要说的是,有两种显而易见的技术能够解决此问题(我们排除了所有高级熵编码技术以假设你从未听说它们)。

方法1:每个A和B都使用1个字节存储,一共占用21字节的存储空间。

方法2:使用如下方法:

  • 第一个字符“A”用1个字节存储

  • 数字“20”用1个字节存储

  • 字母“B”用1个字节存储

  • 数字“1”用1个字节存储

我们最后就得出:

A20B1

只用了4个字节,厉害吧!

好了,我们把称为码流的A20B1传给你的朋友吧!

等等!他该如何理解这个码流?除了你我以外,其他人根本不知道它是什么意思。是的!这就是我们需要定义一种语言来处理数据的原因。这种语言需要设置明确的规则来管理“编码或压缩”数据的“解码和解压缩”。

我们暂且将这种语言称为 Compresslt

CompressIt 的规则非常简单:

  • 奇数字节代表要存储的字母

  • 偶数字节代表连续字母的存储次数

设计完我们的语言后,我现在可以将 CompressIt 的规范发布在网上以供其他工程师阅读并发现可能存在的漏洞或错误。

一个只有两行字的文件中,还会有什么错误?

我想说的是,非常有可能。比如,有人可能会站出来说:“嘿,伙计们!如果一个字母重复256次怎么办?我这么问是因为256已经超过了一个字节所能容纳的值。”

糟糕!我们犯了一个大错!但你看,这也说明了peer review的重要性!现在,语言创造者(你和我)需要重新制定一个更好的规范,并再次发给大家review。

整个过程会一直持续,直到解决所有问题,而且所有人(编解码器工程师)将在这种语言规范上达成一致。

   编解码器诞生了!

我一直在上面的例子中使用“语言”一词,但实际上你和我刚才做的正是在定义和实现一个编解码器——数据压缩和解压缩方案

在现实世界中,编解码器是这样诞生的(大部分情况):

一群被称为“编解码委员会”的人聚到一起,然后:

  • 告诉全世界,现在需要新的编解码器并明确规定要求(如:提高50%的压缩率、能压缩8K视频、新的色彩格式等)

  • 征求贡献、提议和建议,并评估其可行性

  • 协调所有必要的文档、测试和实验,以确定生成编解码器的规则和工具

  • 最后,发布编解码器的标准供全世界使用

每一个视频编解码器(H.264/AVC、AV1和VP9等)都需要经历这样一个过程。现在你知道编解码器是如何诞生的了吧! 

但是,有必要详细解释视频编解码器吗?直接发布软件不行吗?这种标准难道不是在浪费时间和金钱吗?

   明确规范编解码器对行业有何帮助?

好问题!为了更好地理解,让我们回到上面Compresslt的例子。

如果俄罗斯的某位工程师想要为Compresslt编解码器写一个解码器,他需要做的就是拿到一份编解码器的规范并理解它。

在学习Compresslt的过程中,他意识到他需要:

  • 获取传入的数据流或者读取使用CompressIt压缩的文件

  • 读取奇数字节并用它表示字母(比如X)

  • 读取偶数字节(N)并用它表示出现N次字母X

  • 重复这个过程直至文件结束

准确的说,这就是编解码器标准所实现的事——它明确规定了码流的外观和行为,以便所有人都可以为它编写解码器。

它不会告诉你如何创建码流,只会告诉你码流看起来应该是什么样子的。

下面这个现实中的例子充分说明了视频编解码器及其规范的重要性。

假如你在网上看到了这样的新闻:“苹果将在下一个发布的版本中添加对HEVC的支持”,这意味着苹果的技术团队:

  • 下载了一份HEVC规范

  • 阅读规范(一遍又一遍,一遍又一遍——打开规范,你就会明白为什么要这么做)

  • 编写一个程序,可以解码HEVC码流

  • 计划在下一次软件更新时发布该程序

他们为什么能够做到这些?

因为一群工程师聚在一起创建了HEVC视频压缩标准,并发布了一份文件,详细说明了解码的每个步骤和码流的语义,这样世界上的任何人都能为它编写解码器。

   编解码器规范会定义编码器吗?

不会,但是这个问题有些歧义,让我来解释一下。

编解码器规范会告诉你语言中存在哪些工具,编码器的输出应该是什么样子,以及解码器会如何解析它。

但这也意味着你可以以任意一种方式编写编码器——只要编码器产生的码流符合规范的要求。这是我最想强调的重点。

换言之,

  • 如果你正在使用CompressIt 压缩数据,你不能切换奇数字节和偶数字节的含义,这样所有解码器都会将它们混淆。

  • 但是,你可以使用任意技术计数和记录连续的字母,以及它们重复的次数。如果你愿意的话,你还可以用量子计算机!只要你能确保从编码器输出的码流符合规范。

注意:你肯定会因为使用量子计算机而被解雇,但你仍然能编写一个有效的编码器,是不是看到了一线希望?

很好,现在你需要回答一个问题。

当你编写编码器或者解码器的时候,你怎么能知道它会顺利运行呢?换句话说,有没有可以比对代码的黄金标准或者参考编码器/解码器?

   测试模型和参考编码器&解码器

为了满足大家对黄金标准和参考的需求,编解码器委员会和工作组发布了“测试模型”和参考编码器和解码器。

但它们并不会优化速度和性能,仅包含符合规范的编码器和解码器的实现,你可以使用它们来验证编码器实现生成的码流。

此外,委员会经常发布符合标准的编码码流。解码器制造商可以使用这些码流来测试他们的软件或硬件是否遵循编解码器规范。

   结束语

我希望你现在已经理解了什么是视频编解码器、视频编码标准以及它们与编码器和解码器开发之间的关系,在后续的文章中,我们将一起学习视频编解码器中的各类工具是如何工作的。


致谢

本文已获得作者Krishna Rao Vijayanagar授权翻译和发布,特此感谢。

原文链接:https://ottverse.com/what-is-a-video-codec/

延伸阅读:

视频编码完全指南

Easy Tech:什么是I帧、P帧和B帧?

为什么视频压缩如此重要


讲师招募

LiveVideoStackCon 2022 音视频技术大会 上海站,正在面向社会公开招募讲师,无论你所处的公司大小,title高低,老鸟还是菜鸟,只要你的内容对技术人有帮助,其他都是次要的。欢迎通过 speaker@livevideostack.com 提交个人资料及议题描述,我们将会在24小时内给予反馈。

喜欢我们的内容就点个“在看”吧!

以上是关于如何给小白解释什么是编解码器的主要内容,如果未能解决你的问题,请参考以下文章

java是编程式语言还是解释性语言

python小白 想问以下代码是如何实现base64解码的

如果我是小白, 学Python要准备什么呢?

小白如何制作sitemap.xml和html网站地图?实操

有趣的 C++ 代码片段,有啥解释吗? [复制]

有人可以解释啥是 SVN 平分算法吗?理论上和通过代码片段[重复]