必须要掌握的音视频编码、解码!

编码基本原理

编码解码技术的基本原理涵盖了数字信号、声音信号、图像信号以及视频信号等多个方面。

数字信号编码原理

数字信号编码的基本原理是采样和量化。首先,将连续信号离散化成一个一个的采样点,然后用量化器将每个采样点映射成对应的离散值。在此基础上,可以使用多种编码方式,例如差分编码、霍夫曼编码和算术编码等。

声音信号编码原理

声音信号编码的基本原理是通过将模拟声音信号转换成数字信号进行编码。声音信号编码包含了模拟信号的采样和量化,以及数字信号的编码和压缩。常见的声音编码方式包括脉冲编码调制(PCM)和自适应差分脉冲编码(ADPCM)等。

图像信号编码原理

图像信号编码的基本原理是通过采样、量化和编码将图像信号转换成数字信号。在图像信号编码中,常用的压缩算法包括 JPEG、GIF 和 PNG 等。

视频信号编码原理

视频信号编码的基本原理是通过将视频信号分解成一系列的图像帧,并将这些图像帧编码成数字信号。视频编码通常采用先压缩再编码的方法,即先对每一帧图像进行压缩处理,然后对压缩后的数据进行编码。常见的视频编码方式包括 H.264、H.265 和 VP9 等。

值得一提的是,华为公司提出的全新的视频编码技术——华为 5G 编码技术(H.266/VVC),该技术通过多种先进的算法,能够在保证视频质量的前提下,将视频数据压缩至更小的尺寸,从而有效提高了网络传输效率。

本文福利, 免费领取C++音视频学习资料包、技术视频/代码,内容包括(音视频开发,面试题,FFmpeg ,webRTC ,rtmp ,hls ,rtsp ,ffplay ,编解码,推拉流,srs)↓↓↓↓↓↓见下面↓↓文章底部点击免费领取↓↓

如何学习音视频编码、解码!

视频编码的实现原理

编码就是为了压缩。要实现压缩,就要设计各种算法,将视频数据中的冗余信息去除。

当你面对一张图片,或者一段视频的时候,你想一想,如果是你,你会如何进行压缩呢?

我觉得,首先你想到的,应该是找规律。

是的,寻找像素之间的相关性,还有不同时间的图像帧之间,它们的相关性。

举个例子,如果一幅图(1920×1080分辨率),全是红色的,我有没有必要说2073600次[255,0,0]?我只要说一次[255,0,0],然后再说2073599次“同上”。

如果一段1分钟的视频,有十几秒画面是不动的,或者,有80%的图像面积,整个过程都是不变(不动)的。那么,是不是这块存储开销,就可以节约掉了?

是的,所谓编码算法,就是寻找规律,构建模型。谁能找到更精准的规律,建立更高效的模型,谁就是厉害的算法。

通常来说,视频里面的冗余信息包括:

视频编码技术优先消除目标,就是空间冗余和时间冗余。

接下来再给大家介绍一下,究竟是采用什么样的办法才能干掉它们。

以下内容稍微有点高能,不过我相信大家耐心一些还是可以看懂的。

视频是由不同的帧画面连续播放形成的。

这些帧,主要分为三类,分别是I帧,B帧,P帧。

I帧,是自带全部信息的独立帧,是最完整的画面(占用的空间最大),无需参考其它图像便可独立进行解码。视频序列中的第一个帧,始终都是I帧。

P帧,“帧间预测编码帧”,需要参考前面的I帧和/或P帧的不同部分,才能进行编码。P帧对前面的P和I参考帧有依赖性。但是,P帧压缩率比较高,占用的空间较小。

B帧,“双向预测编码帧”,以前帧后帧作为参考帧。不仅参考前面,还参考后面的帧,所以,它的压缩率最高,可以达到200:1。不过,因为依赖后面的帧,所以不适合实时传输(例如视频会议)。

通过对帧的分类处理,可以大幅压缩视频的大小。毕竟,要处理的对象,大幅减少了(从整个图像,变成图像中的一个区域)。

如果从视频码流中抓一个包,也可以看到I帧的信息,如下:

我们来通过一个例子看一下。

这有两个帧:

好像是一样的?

不对,我做个GIF动图,就能看出来,是不一样的:

人在动,背景是没有在动的。

第一帧是I帧,第二帧是P帧。两个帧之间的差值,就是如下:

也就是说,图中的部分像素,进行了移动。移动轨迹如下:

这个,就是运动估计和补偿。

当然了,如果总是按照像素来算,数据量会比较大,所以,一般都是把图像切割为不同的“块(Block)”或“宏块(MacroBlock)”,对它们进行计算。一个宏块一般为16像素×16像素。

将图片切割为宏块

好了,我来梳理一下。

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

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

需要特别注意,I帧(帧内编码),虽然只有空间相关性,但整个编码过程也不简单。

如上图所示,整个帧内编码,还要经过DCT(离散余弦变换)、量化、编码等多个过程。限于篇幅,加之较为复杂,今天就放弃解释了。

那么,视频经过编码解码之后,如何衡量和评价编解码的效果呢?

一般来说,分为客观评价和主观评价。

客观评价,就是拿数字来说话。例如计算“信噪比/峰值信噪比”。

搞通信的童鞋应该对这个概念不会陌生吧?

信噪比的计算,我就不介绍了,丢个公式,有空可以自己慢慢研究...

视频编码的国际标准

接下来,我们再说说标准(Standard)

任何技术,都有标准。自从有视频编码以来,就诞生过很多的视频编码标准。

提到视频编码标准,先介绍几个制定标准的组织。

首先,就是大名鼎鼎的ITU(国际电信联盟)。

ITU是联合国下属的一个专门机构,其总部在瑞士的日内瓦。

ITU下属有三个部门,分别是ITU-R(前身是国际无线电咨询委员会CCIR)、ITU-T(前身是国际电报电话咨询委员会CCITT)、ITU-D。

除了ITU之外,另外两个和视频编码关系密切的组织,是ISO/IEC。

ISO大家都知道,就是推出ISO9001质量认证的那个“国际标准化组织”。IEC,是“国际电工委员会”。

1988年,ISO和IEC联合成立了一个专家组,负责开发电视图像数据和声音数据的编码、解码和它们的同步等标准。这个专家组,就是大名鼎鼎的MPEG,Moving Picture Expert Group(动态图像专家组)

三十多年以来,世界上主流的视频编码标准,基本上都是它们提出来的。

ITU提出了H.261、H.262、H.263、H.263+、H.263++,这些统称为H.26X系列,主要应用于实时视频通信领域,如会议电视、可视电话等。

ISO/IEC提出了MPEG1、MPEG2、MPEG4、MPEG7、MPEG21,统称为MPEG系列。

ITU和ISO/IEC一开始是各自捣鼓,后来,两边成立了一个联合小组,名叫JVT(Joint Video Team,视频联合工作组)

JVT致力于新一代视频编码标准的制定,后来推出了包括H.264在内的一系列标准。

压缩率对比

大家特别注意一下上图里面的HEVC,也就是现在风头正盛的H.265。

作为一种新编码标准,相比H.264有极大的性能提升,目前已经成为最新视频编码系统的标配。

视频解码分为:软解与硬解

硬解和软解

硬解:从字面意思上理解就是用硬件来进行解码,通过显卡的视频加速功能对高清视频进行解码,很明显就是一个专门的电路板(这样好理解...)来进行视频的解码,是依靠显卡 GPU 的。

软解:字面上理解就是用软件进行解码,这样理解也对,但是实际最总还是要硬件来支持的,这个硬件就是 CPU 。

既然有这两种不同的解码方式,我们在开发中该如何进行选择?哪个更好?

硬解优缺点 显卡核心 GPU 拥有独特的计算方法,解码效率非常高,而且充当解码核心的模块成本并不高。这样不但能够减轻 CPU 的负担,还有着低功耗、发热少等特点。

但是由于硬解码起步比较晚, 软件和驱动对其的支持度低。硬解码内置有什么样的模块就能够解码什么样的视频,面对网络上杂乱无章的视频编码格式,不可能做到完全兼容同。

此外,硬解码的滤镜、字母、画质增强方面都做的十分不足。

优点:低功耗、发热少、效率高。 缺点:视频兼容性差、支持度低

软解优缺点

软解码技术的解码过程中,需要对大量的视频信息进行运算,对 CPU 性能的要求非常高。

尤其是对高清晰度大码率的视频来说,巨大的运算量就会造成转换效率低、发热量大等问题。

但是由于软解码的过程中不需要复杂的硬件支持,兼容性非常高。即使是新出的视频编码格式,只要安装好相应的解码器文件,就能顺利播放。

而且软解码拥有丰富的滤镜、字幕、画面处理优化等效果, 如果CPU足够强悍的话,能够实现更加出色的画面效果。

优点:兼容强、全解码、效果好。 缺点:对CPU要求高、效率低、发热大。

选硬解还是软解

关于软解与硬解究竟哪个更好的问题一直是争论的热点,其实我倒是感觉没有好坏之分,各自有各自的优缺点和使用条件,根据需要去选择才是最合适的。

播放码率比较大的视频,硬解可能流畅的播放,但是软解可能会出现演示、画面和声音卡顿不同步的问题。

但是硬解播放出的视频大多都不允许在解码之后进行软件后处理,比如进行一些降噪锐化之类的后期滤镜, 这样可能会让人感觉画质不太好的。

当然上面的这种情况也是和 CPU 及 GPU 能力的不同而不同的。总的来说,还是各有春秋,适合你的才是最好的。

最后,我再说说封装

对于任何一部视频来说,只有图像,没有声音,肯定是不行的。所以,视频编码后,加上音频编码,要一起进行封装。

封装,就是封装格式,简单来说,就是将已经编码压缩好的视频轨和音频轨按照一定的格式放到一个文件中。再通俗点,视频轨相当于饭,而音频轨相当于菜,封装格式就是一个饭盒,用来盛放饭菜的容器。

目前主要的视频容器有如下:MPG、VOB、MP4、3GP、ASF、RMVB、WMV、MOV、Divx、MKV、FLV、TS/PS等。

封装之后的视频,就可以传输了,你也可以通过视频播放器进行解码观看。

相关应用

编码解码技术在信息传输、存储、处理等领域有着广泛的应用,下面列举几个常见的应用领域:

音频和视频的编码和解码技术在音乐、电影等领域的应用

在音乐、电影等领域中,编码解码技术被广泛应用于音频和视频的压缩、存储、传输等方面。采用合适的编码和解码算法,可以实现高质量的音频和视频传输和存储,节省存储空间和带宽。

数字电视、数字音乐、数字电影的发展与应用

数字电视、数字音乐、数字电影等数字化媒体的发展与应用,离不开编码解码技术的支持。通过数字化的编码和解码,数字媒体可以在网络上高效传输、存储和播放,实现数字内容的分享和消费。

移动通信领域中的编码解码技术应用

在移动通信领域,编码解码技术被广泛应用于语音、图像、视频等信号的传输和处理。随着 5G 网络的到来,编码解码技术对于网络传输速度和延迟的影响更加明显。目前,华为公司已经推出了自主研发的 5G 编码技术,可以提高 5G 网络的传输效率和稳定性。在 2021 年的联想股东大会上,联想公司也曾提到将通过投票支持 H.265 视频编码标准,进一步推动编码解码技术在移动通信领域的发展。

本文福利, 免费领取C++音视频学习资料包、技术视频/代码,内容包括(音视频开发,面试题,FFmpeg ,webRTC ,rtmp ,hls ,rtsp ,ffplay ,编解码,推拉流,srs)↓↓↓↓↓↓见下面↓↓文章底部点击免费领取↓↓

猜你喜欢

转载自blog.csdn.net/m0_60259116/article/details/132564917