03-视频编码

前言

本篇文章将介绍关于音视频开发相关的很多概念,只有将这些概念弄清楚了,才能决定我们在音视频开发这条路上能走多远,所以,希望大家能够理解这些。

一、视频封装格式

我们常见的视频封装格式有:.mov、.avi、.mpg、.vob、.mkv、.rm、.rmvb 等等。为什么会有这么多种不同的文件格式?那是因为它们通过不同的方式实现了视频这件事情,至于这个不同在哪里,那就需要了解一下接下来要说的**「视频封装格式」**这个概念了。

1.1 视频封装格式

视频封装格式,简称视频格式,相当于一种存放视频信息的容器,它里面包含了视频信息音频信息和相关的配置信息(例如:视频和音频的关联信息、如何解码等)。视频封装格式最直接的反映就是视频文件格式,如下表 ?

视频文件格式 视频封装格式 释义
.avi AVI(Audio Video Interleave) 图像质量好,但体积过于庞大,压缩标准不统一,存在高低版本兼容问题。
.wmv WMV(Windows Media Video) 可边下载边播放,很适合网上播放和传输
.mpg .mpeg .mpe .dat .vob .asf .3gp .mp4 MPEG(Moving Picture Experts Group) 由运动图像专家组制定的视频格式,有三个压缩标准,分别是 MPEG-1、MPEG-2、和 MPEG-4,它为了播放流式媒体的高质量视频而专门设计的,以求使用最少的数据获得最佳的图像质量。
.mkv Matroska 一种新的视频封装格式,它可将多种不同编码的视频及 16 条以上不同格式的音频和不同语言的字幕流封装到一个 Matroska Media 文件当中。
.rm、.rmvb Real Video Real Networks 公司所制定的音频视频压缩规范称为 Real Media。用户可以使用 RealPlayer 根据不同的网络传输速率制定出不同的压缩比率,从而实现在低速率的网络上进行影像数据实时传送和播放。
.mov QuickTime File Format Apple 公司开发的一种视频格式,默认的播放器是苹果的 QuickTime。这种封装格式具有较高的压缩比率和较完美的视频清晰度等特点,并可以保存 alpha 通道。
.flv Flash Video 由 Adobe Flash 延伸出来的一种网络视频封装格式。这种格式被很多视频网站所采用。

1.2 容器

将已经编码压缩好视频数据和音频数据按照一定的格式放到一个文件中,这个文件可以称为容器。当然可以理解为这只是一个外壳

通常,除了音频数据和视频数据外,还会存放一些视频同步的元数据:例如字幕,这种多数据会给不同的程序来处理,但是在传输和存储的时候,又是被绑定在一起的。

二、常用视频和音频编码格式介绍

2.1 视频编解码

视频编解码的过程–>对数字视频进行压缩或解压缩的过程。

2.2 常见的视频编解码方式

  • .H26x系列 由国际电传视讯联盟远程通信标准化组织(ITU-T)主导,包括 H.261、H.262、H.263、H.264、H.265

    • .H261 用于老的视频会议或视频电话系统,之后的所有标准都基于它设计的。

    • .H262 等同于 MPEG-2 第二部分,使用在 DVD、SVCD 和大多数数字视频广播系统和有线分布系统中。

    • .H263 主要用于视频会议、视频电话和网络视频相关产品。比它之前的视频编码标准在性能上有了较大的提升。尤其是在低码率端,它可以在保证一定质量的前提下大大的节约码率。

    • .H264 等同于 MPEG-4 第十部分,也被称为高级视频编码(Advanced Video Coding,简称 AVC),是一种视频压缩标准,一种被广泛使用的高精度视频的录制、压缩和发布格式。该标准引入了一系列新的能够大大提高压缩性能的技术,并能够同时在高码率端和低码率端大大超越以前的诸标准。

    • .H265 高效率视频编码(High Efficiency Video Coding,简称 HEVC)是一种视频压缩标准,是 H.264 的继任者。HEVC 被认为不仅提升图像质量,同时也能达到 H.264 两倍的压缩率(等同于同样画面质量下比特率减少了 50%),可支持 4K 分辨率甚至到超高画质电视,最高分辨率可达到 8192×4320(8K 分辨率),这是目前发展的趋势。

  • MPEG系列 由国际标准组织机构(ISO)下属的运动图象专家组(MPEG)开发。

    • MPEG-1 第二部分,主要使用在 VCD 上,有些在线视频也使用这种格式。该编解码器的质量大致上和原有的 VHS 录像带相当。
    • MPEG-2 第二部分,等同于H.262,使用在 DVD、SVCD 和大多数数字视频广播系统和有线分布系统中。
    • MPEG-4 第二部分,可以使用在网络传输、广播和媒体存储上。比起MPEG-2 第二部分和第一版的H.263,它的压缩性能有所提高。
    • MPEG-4 第十部分,等同于H.264,是这两个编码组织合作诞生的标准。

不选择H265的原因

  • iOS11.0之后才支持H265
  • 相对于H264H265对CPU造成的负荷更大,当然CPU发热更严重。

2.3「编解码方式」和「封装格式」的关系

「视频封装格式」= 视频 + 音频 +视频编解码方式 等信息的容器。

一种「视频封装格式」可以支持多种「视频编解码方式」。比如:QuickTime File Format(.MOV) 支持几乎所有的「视频编解码方式」,MPEG(.MP4) 也支持相当广的「视频编解码方式」。

比较专业的说法可能是以 A/B 这种方式,A 是「视频编解码方式」,B 是「视频封装格式」。比如:一个 H.264/MOV 的视频文件,它的封装方式就是 QuickTime File Format,编码方式是 H.264。

2.4 音频编解码方式

经常使用的音频编码方式有??

  • AAC,英文全称 Advanced Audio Coding,是由 Fraunhofer IIS、杜比实验室、AT&T、Sony等公司共同开发,在 1997 年推出的基于 MPEG-2 的音频编码技术。2000 年,MPEG-4 标准出现后,AAC 重新集成了其特性,加入了 SBR 技术和 PS 技术,为了区别于传统的 MPEG-2 AAC 又称为 MPEG-4 AAC。
  • MP3,英文全称 MPEG-1 or MPEG-2 Audio Layer III,是当曾经非常流行的一种数字音频编码和有损压缩格式,它被设计来大幅降低音频数据量。它是在 1991 年,由位于德国埃尔朗根的研究组织 Fraunhofer-Gesellschaft 的一组工程师发明和标准化的。MP3 的普及,曾对音乐产业造成极大的冲击与影响。
  • WMA,英文全称 Windows Media Audio,由微软公司开发的一种数字音频压缩格式,本身包括有损和无损压缩格式。

2.5 直播/小视频中的编码格式

  • 视频编码格式–> H264,低码率,高质量图像,容错能力强,网络适应强,具有很高的数据压缩比,能达到惊人的102:1
  • 音频编码格式–> AAC,目前比较热门的有损压缩编码技术,在小于128Kbit/s的码率下表现优异,并且多用于视频中的音频编码。并且衍生了LC-AAC,HE-AAC,HE-AAC v2 三种主要编码格式.
    • LC-AAC 是比较传统的AAC,主要应用于中高码率的场景编码(>= 80Kbit/s)
    • HE-AAC 主要应用于低码率场景的编码(<= 48Kbit/s)

2.6 RGB & YUV

通常我们采用RGB模型来表示颜色,RGB模型中,每种颜色需要3个数字分别表示R、G、B,每个数字占用1个bit字节,这样总共需要24bits

image.png

那么有没有更高效的颜色模型用更少的bit来表示颜色呢?–>YUV,Y表示亮度,也是灰阶值,U和V表示色度分量。

现在我们假设我们定义一个 「亮度(Luminance)」 的概念来表示颜色的亮度,那它就可以用含 R、G、B 的表达式表示为?

Y = kr*R + kg*G + kb*B
复制代码

Y 即「亮度」,kr、kg、kb 即 R、G、B 的权重值。

这时,我们可以定义一个 「色度(Chrominance)」 的概念来表示颜色的差异?

Cr = R – Y
Cg = G – Y
Cb = B – Y
复制代码

Cr、Cg、Cb 分别表示在 R、G、B 上的色度分量。上述模型就是 YCbCr 颜色模型基本原理。

YCbCr 是属于 YUV 家族的一员,是在计算机系统中应用最为广泛的颜色模型,就比如在本文所讲的视频领域。

在 YUV 中 Y 表示的是「亮度」,也就是灰阶值,U 和 V 则是表示「色度」。

YUV 的关键是在于它的亮度信号 Y色度信号 U、V分离的,那就是说即使只有 Y 信号分量而没有 U、V 分量,我们仍然可以表示出图像,只不过图像是黑白灰度图像。在YCbCr 中 Y 是指亮度分量,Cb 指蓝色色度分量,而 Cr 指红色色度分量。

现在我们从 ITU-R BT.601-7 标准中拿到推荐的相关系数,就可以得到 YCbCr 与 RGB 相互转换的公式 ?

Y = 0.299R + 0.587G + 0.114B
Cb = 0.564(B - Y)
Cr = 0.713(R - Y)
R = Y + 1.402Cr
G = Y - 0.344Cb - 0.714Cr
B = Y + 1.772Cb
复制代码

至此,我们对 YCbCr 这个颜色模型我们就有个初步认识了,但是细心的你会发现,这里 YCbCr 也仍然用了 3 个数字来表示颜色啊,有节省 bit 吗?请看下图 ??

  • 假设图片有如下像素组成

image.png

  • 一副图片就是一个像素阵列.每个像素的 3 个分量的信息是完整的,YCbCr 4:4:4

image.png

  • 下图中,对于每个像素点都保留「亮度」值,但是省略每行中偶素位像素点的「色度」值,从而节省了 bit。YCbCr4:2:2

image.png

  • 下图,做了更多的省略,但是对图片质量的影响却不会太大.YCbCr4:2:0

image.png

所以,目前90%以上的直播啊,小视频啊都采用的这种YCbCr4:2:0

三、直播流程解释

作为一名iOS开发者,尤其是要做音视频业务相关的开发,当然需要熟悉App端的直播流程,总共分8步 ?

  1. 音视频采集
  2. 视频滤镜
  3. 音视频编码
  4. 推流
  5. 流媒体服务器
  6. 拉流
  7. 音视频解码
  8. 音视频播放

音视频采集

image.png

音视频采集就是我们之前写的AVFoudation捕捉 ?? 01-AVFoundation捕捉02-AVFoundation高级捕捉

视频滤镜

image.png

一般都是使用GPUImage来实现一些滤镜的功能,所以我们要重点理解并掌握GPUImage的底层原理

音视频编码

image.png

其中,硬编码是跟GPU相关的,苹果在iOS8.0之后推出了2个硬编码的框架videoToolBoxAudioToolBox

推流

image.png

流媒体服务器

image.png

拉流

image.png

音视频解码

image.png

音视频播放

image.png

以上只是整个直播中的一些关键技术点,还有很多细节,很多页面等逻辑都没有详细说明,试想,这些工作一个人肯定是无法完成的,所以需要一个团队,每个人负责其中的某一个环节。所以,想在短时间内全部掌握,达到精通的水平,肯定不可能哈!?

封面

最后,我们再来了解一下封面,视频的展示所需要,一般有3种方式获取 ?

  1. 服务器分发给你 ?? 直播(支持回放!)
  2. 客户端:默认第一帧视频就是封面 ?? 小视频
  3. 客户端:从视频中选择合适的一帧作为封面 ?? 小视频

四、直播和小视频架构分析

4.1 直播架构

image.png

上图只是对之前的直播流程思维导图的一个分端处理而已,每个端列举出了一些常用的技术点或常用框架。接着我们看看架构的划分图??

image.png

大致分一下几个部分 ??

  1. 视频采集端(拍摄者)使用苹果或安卓手机录制音视频,然后添加一些美颜、滤镜等效果,再经过编码(压缩),使用流媒体协议上传至服务端。
  2. 云服务端CDN点播流媒体接收到音视频流后,会做一系列的处理,其中包括加密等保护措施,处理完成后存储到服务器,同时产生播放地址。
  3. 播放端使用对应的播放器,根据对应的播放地址解密、解码音视频的数据进行播放。

4.2 小视频架构

image.png

小视频架构相对于直播架构来说,稍微简单一些,但是大致流程差不多,需要注意的是 ??

  • 小视频的视频采集使用的是Texture纹理模式来传输,音频则使用的是PCM模式
  • 小视频可能会很大(比如超清版),此时使用的是FFMPEG框架进行封包
  • 封包完成后,在输出阶段进行2个动作,一是本地存储,二是HTTP上传,上传时需考虑断点续传这个场景

五、泛娱乐和实时直播服务器架构解析

直播分为2类 ??

  • 泛娱乐直播 ?? 游戏类,娱乐类直播,例如虎牙、斗鱼等
  • 实时互动直播 ?? 教育类直播,例如腾讯课堂

5.1 泛娱乐直播架构

image.png

  1. 首先主播端信令服务器发请求,申请房间
  2. 信令服务器会开辟个房间,并把流媒体CDN服务器地址返回给主播端
  3. 主播端拿到流媒体CDN服务器地址,开始向CDN推流音视频数据
  4. 播放端则向流媒体CDN服务器不断拉流,就可以看到主播端的音视频了

5.2 实时互动直播架构

image.png

使用UDP的原因

因为直播时我们要的是快,实时实效,即使丢包问题也不大,如果使用TCP协议,那么客户端和服务端之间就会等待数据的发送完整,试想昨天发的数据得等到今天才收到,就毫无意义了。

  1. 客户端使用UDP协议传输数据给服务器,和泛娱乐架构一样,服务器分信令服务器媒体服务器
  2. 同时,服务器得保证24h不间断的稳定服务,所以会有多个信令服务器媒体服务器,即使其中某个服务器即使出了问题,也能及时切换到另一个服务器,保证服务的稳定性与健壮性
  3. 既然有多个信令服务器媒体服务器,就必须保证每台服务器负载均衡,这就是控制中心所负责的,怎么做的呢???

信令服务器媒体服务器就好比是个节点,每个节点会定时向控制中心汇报健康指数,这个健康指数包括cpu的占用率,内存占用、IO占用、网络占用百分比等情况,每隔一段时间汇报,保证每个节点正常的运作,当然也会出现2种特殊的情况??

  • 如果出现不汇报的或健康指数不达标的,就是有问题,此时控制中心就会将出现问题的节点服务器上的任务切换给正常的节点服务器
  • 如果一个节点很忙,一个节点又比较闲,那么控制中心会将忙的一部分任务交给闲的节点去处理
  1. 继续,还有个中间层,这个中间层可以叫做内存线心跳线,它来负责整合所有节点的数据并传输给媒体服务器

  2. 因为客户端是UDP协议传输来的数据,媒体服务器会将这些数据以rmtp协议做个转换,将实时互动直播数据转换成泛娱乐直播数据,那么我们播放端就能查看到直播的音视频数据了

六、CDN网络解析

CDN网络解析的目的 ?? 解决网络过慢的问题。

CDN大致由三个部分构成??

  1. 边缘节点
  2. 二级节点:也叫主干节点
  3. 源站节点

举个例子来理解上面的构造,我想吃北京烤鸭,但是你人不在北京,比如在长沙,如果直接从长沙去飞到北京,那么这个过程就很耗时,此时我们发现长沙也有全聚德的分店,那么我们在长沙也就能吃到北京烤鸭了,美滋滋!那么此时,北京就好比源站节点,长沙就是边缘节点了,那二级节点呢? ?? 人不在长沙了,去到张家界旅游去了,那么我们只能就近先找到长沙,再订一份送过来,此时长沙就是二级节点边缘节点就是张家界。

还有一种情况,受人为因素影响,就是有2种网络,比如联通网电信网,我们在联通网里面找不到资源,那么就人为地搭根网线,将联通网电信网桥接起来,我们就可以去电信网里继续查找资源,这个桥接的主要对象就是主干节点(即二级节点),将联通的主干节点与电信的主干节点打通。这也是CDN网络解析的一种特殊情况。

七、H264相关概念

接下来,就看看与H264编解码相关的一些基本概念。

7.1 IBP帧

I帧: 关键帧,采用帧内压缩技术.

举个例子,如果摄像头对着你拍摄,1秒之内,实际你发生的变化是非常少的.1秒钟之内实际少很少有大幅度的变化.摄像机一般一秒钟会抓取几十帧的数据.比如像动画,就是25帧/s,一般视频文件都是在30帧/s左右.对于一些要求比较高的,对动作的精细度有要求,想要捕捉到完整的动作的,高级的摄像机一般是60帧/s.那些对于一组帧的它的变化很小.为了便于压缩数据,那怎么办了?将第一帧完整的保存下来.如果没有这个关键帧后面解码数据,是完成不了的.所以I帧特别关键.

P帧: 向前参考帧.压缩时只参考前一个帧.属于帧间压缩技术.

视频的第一帧会被作为关键帧完整保存下来.而后面的帧会向前依赖.也就是第二帧依赖于第一个帧.后面所有的帧只存储于前一帧的差异.这样就能将数据大大的减少.从而达到一个高压缩率的效果.

B帧: 双向参考帧,压缩时即参考前一帧也参考后一帧.帧间压缩技术.

  • B帧,即参考前一帧,也参考后一帧.这样就使得它的压缩率更高.存储的数据量更小.如果B帧的数量越多,你的压缩率就越高.这是B帧的优点,但是B帧最大的缺点是,如果是实时互动的直播,那时与B帧就要参考后面的帧才能解码,那在网络中就要等待后面的帧传输过来.这就与网络有关了.如果网络状态很好的话,解码会比较快,如果网络不好时解码会稍微慢一些.丢包时还需要重传.对实时互动的直播,一般不会使用B帧.
  • 如果在泛娱乐的直播中,可以接受一定度的延时,需要比较高的压缩比就可以使用B帧.
  • 如果我们在实时互动的直播,我们需要提高时效性,这时就不能使用B帧了.

7.2 GOF(Group of Frame)一组帧

如果在一秒钟内,有30帧.这30帧可以画成一组.如果摄像机或者镜头它一分钟之内它都没有发生大的变化.那也可以把这一分钟内所有的帧画做一组.

什么叫一组帧?

就是一个I帧到下一个I帧.这一组的数据.包括B帧/P帧.我们称为GOF.如下图 ?

image.png

GOF有什么好处了?它能解决什么问题了?

这个与我们接下来所学习的内容有关了.

7.3 SPS/PPS

SPS/PPS实际上就是存储GOP的参数.

SPS: (Sequence Parameter Set,序列参数集)存放帧数,参考帧数目,解码图像尺寸,帧场编码模式选择标识等.

PPS:(Picture Parameter Set,图像参数集).存放熵编码模式选择标识,片组数目,初始量化参数和去方块滤波系数调整标识等.(与图像相关的信息)

大家只要记住,在一组帧之前我们首先收到的是SPS/PPS数据.如果没有这组参数的话,我们是无法解码.

如果我们在解码时发生错误,首先要检查是否有SPS/PPS.如果没有,是因为对端没有发送过来还是因为对端在发送过程中丢失了.

SPS/PPS数据,我们也把其归类到I帧.这2组数据是绝对不能丢的.

7.4 视频花屏卡顿原因分析

我们在观看视频时,会遇到花屏或者卡顿现象.那这个与我们刚刚所讲的GOF就息息相关了.

  • 如果GOP分组中的P帧丢失就会造成解码端的图像发生错误.
  • 为了避免花屏问题的发生,一般如果发现P帧或者I帧丢失.就不显示本GOP内的所有帧.只到下一个I帧来后重新刷新图像.
  • 当这时因为没有刷新屏幕.丢包的这一组帧全部扔掉了.图像就会卡在哪里不动.这就是卡顿的原因.

所以总结起来 ?

花屏是因为你丢了P帧或者I帧,导致解码错误. 而卡顿是为了防止花屏,将整组错误的GOP数据扔掉了.直达下一组正确的GOP再重新刷屏.而这中间的时间差,就是我们所感受的卡顿.

八、H264压缩技术

  • 帧内预测压缩 ?? 解决的是空域数据冗余问题.

    什么是空域数据,就是这幅图里数据在宽高空间内包含了很多颜色,光亮.人的肉眼很难察觉的数据. 对于这些数据,我们可以认作冗余.直接压缩掉的.

  • 帧间预测压缩 ?? 解决的是时域数据冗余问题.

    在我们之前举例说明过,摄像头在一段时间内所捕捉的数据没有较大的变化,我们针对这一时间内的相同的数据压缩掉.这叫时域数据压缩.

  • 整数离散余弦变换(DCT) ?? 将空间上的相关性变为频域上无关的数据然后进行量化.

    这个比较抽象.这个跟数学是紧密联系在一起的.如果对傅里叶变换理解的比较好的.对这个会理解的比较难!如果对傅里叶变换不了解的.可能有稍许困难.傅里叶变换可以把一个复杂波形图变换成许多的正弦波.只是他们之间的频率不一样.以及振幅也不一样.如果它们在频率上没有一致性那么我们就可以对他进行压缩处理.

  • CABAC压缩 ?? 无损压缩.

九、H264编码原理详解

接下来,就是解析一下关于H264编码原理相关的一些概念。

9.1 H264宏块划分与分组

image.png

如上图所示, H264将一个图片左上角用宏块描述,就是宏块是8*8的元素.取出的颜色,像右边的图所示那样去描述该颜色.那么,将完整的一个图片全部用宏块描述就如下图所示 ??

image.png

这样基本的图片的宏块划分就完成了。

子块划分

那是不是每个宏块都是8*8了?并不是的,还有子块划分 ??

image.png

在这个大的宏块里,可以再细化。上图左边中间这个全部都是蓝色的这个宏块,就可以用一个色块去描述,更加简单。

上图右边,我们对比旁边的MPEG2H.264

  • MPEG2存储时还说比较完整占用空间相对于比较多.
  • H.264还是减少了很多空间,像重复的颜色他们就用非常简单的色块描述了.

帧分组

例如,一个台球从一个位置移动到另外一个组. 可以发现它的桌面背景是一样的.只是球体位置发生了变换.这个我们就可以把这一组帧划分为一组.

image.png

9.2 组内宏块查找

什么是组内宏块查找?

image.png

如上图,台球从一角滚到另外一角,相邻的2幅图做组内的宏块查找.
将图逐行扫描,扫描到第三行.发现了台球. 然后围绕它的周围查找.发现了有类似的图块.

运动估算

image.png

接着就把这些图块放在同一张图中.也就是说台球刚开始从位置1.到第二张图移动到位置2.这之间有一个运动矢量.矢量会包含运动的方向和距离.将所有的图都两两比较.最后就形成了右边这张图.就是右图中红色部分.每一个红色的箭头标注都是一个运动矢量.很多帧就会形成一个连续的运动估算.

那么这个估算之后,我们要达到什么结果呢?

运动矢量与补偿压缩

最终将连续的运动估算 换算成下图所表现的 ??

image.png

接下来对齐进行压缩.所有帧的背景都是一样的.变换在哪里?变换就是它的运动矢量还有台球的数据. 实际经过我们一运算后.它留下的就只是运动矢量数据+残差值的数据. 经过这样的一个计算.帧间压缩数据我们就可以看到实际我们只需要存储一点点数据.而不像以前要将几十帧的所有图片数据保存下来.这就达到了压缩的效果. 这个过程就叫做帧间压缩技术的原理.

9.3 帧内预测

  • 帧内压缩是针对于I帧的.因为它解决的是空间的数据冗余
  • 帧间压缩是解决的时间数据冗余。上面台球示例 ?? 将大量在时间轨迹上相同的数据压缩掉.只留下运算估量和残差值

帧内压缩原理

而帧内我们采用了其他的压缩原理??

如下图,首先要经过计算,选择用那种模式.

对每一个宏块采用不同的模式运算.

image.png

当每个宏块都选定了模式之后.就形成了下图的这样的效果.帧内预测一共有9种模式,如下图 ??\

帧内预测9种模式原理介绍(1)
帧内预测9种模式原理介绍(2)

image.png

image.png

image.png

让每个宏块挑选好模式之后,我们就可以使用块预测模式.预测完了之后,它就得到一个张”预测图” ?

image.png

左边是预测图,右边是源图.

计算的预测图和原图是有差别的. 原图比较圆润.预测图相对而言比较粗糙.

计算帧内预测残差值:

接着针对这两幅图,做2张图的差计算??

image.png

底下的图就是我们的原图.通过预测与原图的差得出一个结果 ??灰色图,就是残差值.

预测模式与残差值压缩:
拿到残差值之后,我们就进行压缩. 压缩时保存 ?? 残差数据每个宏块选择的模式信息数据. 那么有了这2个数据之后.当我们解码时,首先通过宏块的模式信息计算出预测图.然后将预测图与我们的残差值进行累积.就能还原成原图像. 那这个过程就是"帧内压缩技术"的原理过程,如下图所示 ??

image.png

9.4 DCT压缩

DCT压缩也是整数余弦压缩技术. 那它是如何压缩?
我们划分一个可量化的宏块.

image.png

然后将量化的宏块根据DCT数学方法进行压缩.

image.png

压缩后的就成这个样子 ??\

image.png

左上角有数据分布,右下角数据为空.从而达到数据量减少的作用.那它是如果做到的了? 这个如果计算是需要非常深的数学功底.如果感兴趣的可以在网络上搜索一下.

DCT压缩原理(1)
DCT压缩原理维基百科

9.5 VLC压缩

VLC用类似哈夫曼码. 用短码来记录高频数据.用长码记录低频数据.
频率高的就编为短码,频率低的就编为长码.

image.png

经过VLC压缩之后,就变成了无损压缩的方式了.

CABAC压缩(上下文适应无损压缩技术)

VLC实际上是MPEG2使用的技术.而H264使用的是CABAC.也就是上下文适应技术.除了使用哈夫曼短码高频,长码高频的方式还加上了上下文适应的技术.根据上下文就可以加大压缩比.

image.png

对比:\

  • VLC压缩的数据都是大块.无损压缩.
  • CABAC压缩,会随着压缩的数据增大,上下文信息全面.压缩比随之增大.数据块从大块降低成小数据块.

参考:
CC老师_HelloCoder
音视频学习从零到整

© 版权声明
THE END
喜欢就支持一下吧
点赞0 分享