前言
本篇文章将介绍关于音视频开发
相关的很多概念
,只有将这些概念
弄清楚了,才能决定我们在音视频开发这条路上能走多远,所以,希望大家能够理解这些。
一、视频封装格式
我们常见的视频封装格式有:.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
。- 相对于
H264
,H265
对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
)
- LC-AAC 是比较传统的AAC,主要应用于中
2.6 RGB & YUV
通常我们采用RGB模型
来表示颜色
,RGB模型中,每种颜色需要3个数字分别表示R、G、B
,每个数字占用1个bit字节
,这样总共需要24bits
。
那么有没有更高效
的颜色模型用更少的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
吗?请看下图 ??
-
假设图片有如下像素组成
-
一副图片就是一个像素阵列.每个像素的 3 个分量的信息是完整的,
YCbCr 4:4:4
。
- 下图中,对于每个像素点都保留「亮度」值,但是省略每行中偶素位像素点的「色度」值,从而节省了 bit。
YCbCr4:2:2
- 下图,做了更多的省略,但是对图片质量的影响却不会太大.
YCbCr4:2:0
所以,目前90%以上的直播啊,小视频啊都采用的这种YCbCr4:2:0
。
三、直播流程解释
作为一名iOS开发者,尤其是要做音视频业务
相关的开发,当然需要熟悉App端的直播流程,总共分8步 ?
- 音视频采集
- 视频滤镜
- 音视频编码
- 推流
- 流媒体服务器
- 拉流
- 音视频解码
- 音视频播放
音视频采集
音视频采集
就是我们之前写的AVFoudation捕捉
?? 01-AVFoundation捕捉 和 02-AVFoundation高级捕捉。
视频滤镜
一般都是使用GPUImage
来实现一些滤镜的功能,所以我们要重点理解并掌握GPUImage的底层原理
。
音视频编码
其中,硬编码
是跟GPU相关的,苹果在iOS8.0
之后推出了2个硬编码的框架videoToolBox
和 AudioToolBox
。
推流
流媒体服务器
拉流
音视频解码
音视频播放
以上只是整个直播中的一些关键技术点
,还有很多细节,很多页面等逻辑都没有详细说明,试想,这些工作一个人肯定是无法完成的,所以需要一个团队,每个人负责其中的某一个环节。所以,想在短时间内全部掌握,达到精通的水平,肯定不可能哈!?
封面
最后,我们再来了解一下封面
,视频的展示所需要,一般有3种方式获取 ?
- 服务器分发给你 ?? 直播(支持回放!)
- 客户端:默认第一帧视频就是封面 ?? 小视频
- 客户端:从视频中选择合适的一帧作为封面 ?? 小视频
四、直播和小视频架构分析
4.1 直播架构
上图只是对之前的直播流程思维导图
的一个分端处理
而已,每个端列举出了一些常用的技术点或常用框架。接着我们看看架构的划分图??
大致分一下几个部分 ??
视频采集端
(拍摄者)使用苹果或安卓手机录制音视频,然后添加一些美颜、滤镜等效果,再经过编码(压缩),使用流媒体协议
上传至服务端。云服务端
的CDN
点播流媒体接收到音视频流后,会做一系列的处理,其中包括加密
等保护措施,处理完成后存储到服务器,同时产生播放地址。播放端
使用对应的播放器,根据对应的播放地址
,解密、解码
音视频的数据进行播放。
4.2 小视频架构
小视频架构
相对于直播架构
来说,稍微简单一些,但是大致流程差不多,需要注意的是 ??
- 小视频的视频采集使用的是
Texture纹理
模式来传输,音频则使用的是PCM
模式 - 小视频可能会很大(比如超清版),此时使用的是
FFMPEG
框架进行封包
封包
完成后,在输出
阶段进行2个动作,一是本地存储
,二是HTTP上传
,上传时需考虑断点续传
这个场景
五、泛娱乐和实时直播服务器架构解析
直播分为2类 ??
泛娱乐直播
?? 游戏类,娱乐类直播,例如虎牙、斗鱼等实时互动直播
?? 教育类直播,例如腾讯课堂
5.1 泛娱乐直播架构
- 首先
主播端
向信令服务器
发请求,申请房间 信令服务器
会开辟个房间,并把流媒体CDN服务器
地址返回给主播端
主播端
拿到流媒体CDN服务器
地址,开始向CDN推流音视频数据播放端
则向流媒体CDN服务器
不断拉流,就可以看到主播端
的音视频了
5.2 实时互动直播架构
使用UDP的原因
因为直播时我们要的是快,实时实效
,即使丢包问题也不大,如果使用TCP协议
,那么客户端和服务端之间就会等待
数据的发送完整
,试想昨天发的数据得等到今天才收到,就毫无意义了。
客户端
使用UDP协议
传输数据给服务器
,和泛娱乐架构
一样,服务器分信令服务器
和媒体服务器
- 同时,
服务器
得保证24h不间断的稳定服务,所以会有多个信令服务器
和媒体服务器
,即使其中某个服务器即使出了问题,也能及时切换到另一个服务器,保证服务的稳定性与健壮性 - 既然有多个
信令服务器
和媒体服务器
,就必须保证每台服务器负载均衡
,这就是控制中心
所负责的,怎么做的呢???
信令服务器
和媒体服务器
就好比是个节点
,每个节点
会定时向控制中心
汇报健康指数
,这个健康指数
包括cpu的占用率,内存占用、IO占用、网络占用百分比等情况,每隔一段时间汇报,保证每个节点正常的运作,当然也会出现2种特殊的情况??
- 如果出现
不汇报
的或健康指数不达标
的,就是有问题,此时控制中心
就会将出现问题的节点
服务器上的任务切换给正常的节点
服务器 - 如果一个
节点
很忙,一个节点
又比较闲,那么控制中心
会将忙的一部分任务交给闲的节点去处理
-
继续,还有个
中间层
,这个中间层
可以叫做内存线
或心跳线
,它来负责整合所有节点
的数据并传输给媒体服务器
, -
因为客户端是UDP协议传输来的数据,
媒体服务器
会将这些数据以rmtp
协议做个转换,将实时互动直播
数据转换成泛娱乐直播
数据,那么我们播放端就能查看到直播的音视频数据了
六、CDN网络解析
CDN网络解析的目的 ?? 解决网络过慢
的问题。
CDN大致由三个部分构成??
- 边缘节点
- 二级节点:也叫
主干节点
- 源站节点
举个例子来理解上面的构造,我想吃北京烤鸭,但是你人不在北京,比如在长沙,如果直接从长沙去飞到北京,那么这个过程就很耗时,此时我们发现长沙也有全聚德的分店,那么我们在长沙也就能吃到北京烤鸭了,美滋滋!那么此时,北京就好比源站节点
,长沙就是边缘节点
了,那二级节点
呢? ?? 人不在长沙了,去到张家界旅游去了,那么我们只能就近先找到长沙,再订一份送过来,此时长沙就是二级节点
,边缘节点
就是张家界。
还有一种情况,受人为因素
影响,就是有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.如下图 ?
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宏块划分与分组
如上图所示, H264
将一个图片左上角用宏块
描述,就是宏块是8*8
的元素.取出的颜色,像右边的图所示那样去描述该颜色.那么,将完整的一个图片全部用宏块
描述就如下图所示 ??
这样基本的图片的宏块划分
就完成了。
子块划分
那是不是每个宏块都是8*8
了?并不是的,还有子块划分 ??
在这个大的宏块
里,可以再细化
。上图左边中间这个全部都是蓝色的这个宏块
,就可以用一个色块
去描述,更加简单。
上图右边,我们对比旁边的MPEG2
和H.264
MPEG2
存储时还说比较完整
,占用空间
相对于比较多.H.264
还是减少
了很多空间,像重复的颜色他们就用非常简单的色块描述了.
帧分组
例如,一个台球从一个位置移动到另外一个组. 可以发现它的桌面背景是一样的.只是球体位置发生了变换.这个我们就可以把这一组帧划分为一组.
9.2 组内宏块查找
什么是组内宏块查找?
如上图,台球从一角滚到另外一角,相邻的2幅图
做组内的宏块查找.
将图逐行扫描,扫描到第三行.发现了台球. 然后围绕它的周围查找.发现了有类似的图块.
运动估算
接着就把这些图块放在同一张图中.也就是说台球刚开始从位置1.到第二张图移动到位置2.这之间有一个运动矢量.矢量会包含运动的方向和距离
.将所有的图都两两比较
.最后就形成了右边这张图.就是右图中红色部分.每一个红色的箭头标注都是一个运动矢量
.很多帧就会形成一个连续的运动估算
.
那么这个估算之后,我们要达到什么结果呢?
运动矢量与补偿压缩
最终将连续的运动估算 换算成下图所表现的 ??
接下来对齐
进行压缩.所有帧的背景都是一样的.变换在哪里?变换就是它的运动矢量
还有台球的数据
. 实际经过我们一运算后.它留下的就只是运动矢量数据+残差值
的数据. 经过这样的一个计算.帧间压缩数据我们就可以看到实际我们只需要存储一点点数据.而不像以前要将几十帧的所有图片数据保存下来.这就达到了压缩的效果. 这个过程就叫做帧间压缩技术
的原理.
9.3 帧内预测
帧内压缩
是针对于I帧
的.因为它解决的是空间的数据冗余
。帧间压缩
是解决的时间数据冗余
。上面台球示例 ?? 将大量在时间轨迹上相同的数据压缩掉.只留下运算估量和残差值
。
帧内压缩原理
而帧内我们采用了其他的压缩原理??
如下图,首先要经过计算,选择用那种模式.
对每一个宏块采用不同的模式运算.
当每个宏块
都选定了模式
之后.就形成了下图的这样的效果.帧内预测一共有9种模式,如下图 ??\
帧内预测9种模式原理介绍(1)
帧内预测9种模式原理介绍(2)
让每个宏块挑选好模式之后,我们就可以使用块预测模式
.预测完了之后,它就得到一个张”预测图” ?
左边是预测图
,右边是源图
.
计算的预测图和原图是有差别的. 原图比较圆润.预测图相对而言比较粗糙.
计算帧内预测残差值:
接着针对这两幅图,做2张图的差计算
??
底下的图就是我们的原图.通过预测与原图的差得出一个结果 ??灰色图
,就是残差值
.
预测模式与残差值压缩:
拿到残差值
之后,我们就进行压缩
. 压缩时保存 ?? 残差数据
和每个宏块选择的模式
信息数据. 那么有了这2个数据之后.当我们解码时,首先通过宏块的模式信息
计算出预测图
.然后将预测图
与我们的残差值
进行累积
.就能还原成原图像
. 那这个过程就是"帧内压缩技术"
的原理过程,如下图所示 ??
9.4 DCT压缩
DCT压缩
也是整数余弦压缩
技术. 那它是如何压缩?
我们划分一个可量化的宏块.
然后将量化的宏块根据DCT数学方法
进行压缩.
压缩后的就成这个样子 ??\
左上角有数据分布,右下角数据为空.从而达到数据量减少的作用.那它是如果做到的了? 这个如果计算是需要非常深的数学功底.如果感兴趣的可以在网络上搜索一下.
9.5 VLC压缩
VLC
用类似哈夫曼码
. 用短码来记录高频数据.用长码记录低频数据.
频率高的就编为短码,频率低的就编为长码.
经过VLC压缩之后,就变成了无损压缩的方式了.
CABAC压缩(上下文适应无损压缩技术)
VLC
实际上是MPEG2
使用的技术.而H264
使用的是CABAC
.也就是上下文适应技术.除了使用哈夫曼
短码高频,长码高频的方式还加上了上下文适应的技术.根据上下文就可以加大压缩比.
对比:\
VLC
压缩的数据都是大块.无损压缩.- 而
CABAC
压缩,会随着压缩的数据增大,上下文信息全面.压缩比随之增大.数据块从大块降低成小数据块.