目录
- PCM-脉冲编码调制
- 录音的原理
- 记录声音-音频数字化
- 音频数字化-PCM
- 采样
- 采样
- 采样率
- 采样定理
- 量化
- 位深度
- 编码
- 声道(Channel)
- 比特率
- 信噪比
- 编码(Encode)
- 解码(Decode)
- 常见的音频编码和文件格式
- 无损
- Monkey's Audio
- FLAC
- ALAC
- 有损
- MP3
- WMA
- AAC
- Speex
- Opus
- 文件格式
- Ogg
- WAV
- AIFF
- 有损和无损
- 声波
- 音调
- 响度
- 音色
- 噪音
- 像素
- RGB颜色模型
- 位深度
- 24bit颜色的表示形式
- 颜色数量
- 其他位深度
- 不同位深度的对比
- 格式
- 动画
- YUV
- 体积更小
- 组成
- 兼容性
- RGB和YUV转换
- 公式1
- 公式2
- 公式3
- 色度二次采样
- 原理
- 概念
- 采样格式
- 4:4:4
- 4:2:2
- 4:2:0
- H.264编码
- 编码器
- 解码器
- 编码过程与原理
- 划分帧类型
- GOP的长度
- GOP的类型
- 帧内/帧间编码
- 划分宏块
- 帧内编码
- 帧间编码
- 变换与量化
- 规格
PCM-脉冲编码调制
录音的原理
可以简单理解为:把声源的振动记录下来,需要时再让某个物体按照记录下来的振动规律去振动,就会产生与原来一样的声音。
记录声音-音频数字化
如何把声音(声源的振动)记录下来呢?声音属于模拟信号,但更便于计算机处理和存储的是数字信号(二进制编码),所以需要将模拟信号(Analog Signal)转成数字信号(Digital Signal)后进行存储。这一过程,我们可以称之为:音频数字化。
音频数字化-PCM
将音频数字化的常见技术方案是脉冲编码调制(PCM,Pulse Code Modulation),主要过程是:采样 → 量化 → 编码。
采样
模拟信号的波形是无限光滑的,可以看成由无数个点组成,由于存储空间是相对有限的,数字编码过程中,必须要对波形的点进行采样。
采样
采样(Sampling):每隔一段时间采集一次模拟信号的样本,是一个在时间上将模拟信号离散化(把连续信号转换成离散信号)的过程。
采样率
每秒采集的样本数量,称为采样率(采样频率,采样速率,Sampling Rate)。比如,采样率44.1kHz表示1秒钟采集44100个样本。
采样定理
根据采样定理(奈奎斯特–香农采样定理,Nyquist-Shannon sampling theorem)得知:只有当采样率高于声音信号最高频率的2倍时,才能把采集的声音信号唯一地还原成原来的声音。
人耳能够感觉到的最高声音频率为20000Hz,因此为了满足人耳的听觉要求,需要至少每秒进行40000次采样(40kHz采样率)。
这就是为什么常见的CD的采样率为44.1kHz。
电话、无线对讲机、无线麦克风等的采样率是8kHZ。
人耳听觉 20HZ–20KHZ 敏感 1KHz–4KHz 最敏感 3.4KHz(再往上容易产生听觉疲劳)
人嗓音 男 80Hz–500Hz 女100Hz–1KHz
电话 200/300–3KHZ
电视 100HZ
20–250 LOW (LF) 250–2KHz MID (MF) 2kHz–4KHz MH 4KHz–20KHz High (HF)
根据采样定律,要保证信号传输中不失真,采样频率最起码是最高频率的两倍,也就是说采样频率6800hz以上都可以,至于为什么是8000hz,可以认为是一种约定而已。
量化
量化(Quantization):将每一个采样点的样本值数字化。
位深度
位深度(采样精度,采样大小,Bit Depth):使用多少个二进制位来存储一个采样点的样本值。位深度越高,表示的振幅越精确。常见的CD采用16bit的位深度,能表示65536(216)个不同的值。DVD使用24bit的位深度,大多数电话设备使用8bit的位深度。
就相当于下图纵坐标的间距 位深度越大 纵坐标刻度越密集,表示的振幅越精确。
下图的横坐标间距越小 表示采样率越高
编码
编码:将采样和量化后的数字数据转成二进制码流。
声道(Channel)
单声道产生一组声波数据,双声道(立体声)产生两组声波数据。
采样率44.1kHZ、位深度16bit的1分钟立体声PCM数据有多大?
- 采样率 * 位深度 * 声道数 * 时间
- 44100 * 16 * 2 * 60 / 8 ≈ 10.34MB
1分钟10.34MB,这对于大部分用户来说是不能接受的。
要想在不改变音频时长的前提下,降低音频数据的大小,只有2种方法:
降低采样指标、压缩。
降低采样指标是不可取的,会导致音频质量下降,用户体验变差,因此专家们研发了各种压缩方案。
举个例子:
现在有个需求,在局域网内实现实时语音,传输层协议使用UDP协议,如果直接使用AudioRecord进行录制音频流并发送到另一端进行播放,音质会非常差,而且断断续续,原因如下:
采样频率: fm = 44.1KHz
量化位数:16bit
声道配置:2(双声道)
那么,码率 V = 44.1K * 16 *2 = 1411.2 Kbps = 176.4KBps,即每秒传输速率大概176.4KB,
若音频帧时间为20ms,每个音频数据包大小为 size = 176.4KBps * 0.02s = 3.528KB,
一般情况下,我们每次读取一个音频帧的数据,可以取整为3600Byte,
所以 每秒大概发送 176.4/3.6=49 个数据包,每个数据包大小为3.6KB。
如果再考虑到数据报头,实测每秒发送约45个数据包,每秒传输速率大概180KB。
由于一般都是使用手机连接Wifi,这就要求网络质量和硬件设备必须很好,而且信道干扰较弱,并且链接的设备不能过多。只要稍微信号不好,就会导致丢包率特别高,而且延时十分大,根本无法满足通信的需要。在这种情况下,我们就需要进行语音压缩、降噪等处理。
比特率
比特率(Bit Rate),指单位时间内传输或处理的比特数量,单位是:比特每秒(bit/s或bps),还有:千比特每秒(Kbit/s或Kbps)、兆比特每秒(Mbit/s或Mbps)、吉比特每秒(Gbit/s或Gbps)、太比特每秒(Tbit/s或Tbps)。
采样率44.1kHZ、位深度16bit的立体声PCM数据的比特率是多少?
- 采样率 * 位深度 * 声道数
- 44100 * 16 * 2 = 1411.2Kbps
通常,采样率、位深度越高,数字化音频的质量就越好。从比特率的计算公式可以看得出来:比特率越高,数字化音频的质量就越好。
信噪比
信噪比(Signal-to-noise ratio,SNR,S/N,讯噪比),指信号与噪声的比例,用于比较所需信号的强度与背景噪声的强度,以分贝(dB)为单位。
位深度限制了信噪比的最大值,它们的关系如下表所示。
位深度 | 信噪比 |
---|---|
4 | 24.08 |
8 | 48.16 |
11 | 66.22 |
12 | 72.24 |
16 | 96.33 |
18 | 108.37 |
20 | 120.41 |
24 | 144.49 |
32 | 192.66 |
48 | 288.99 |
64 | 385.32 |
关于信噪比的意义:
图像的信噪比和图像的清晰度一样,都是衡量图像质量高低的重要指标。图像的信噪比是指视频信号的大小与噪波信号大小的比值,其公式为:
S/N(信噪比)= 20 log (信号/噪声)dB
信噪比大,图像画面就干净,看不到什么噪波干扰(表现为“颗粒”和“雪花”),看起来很舒服;若信噪比小,则在画面上,可能满是雪花,严重影响图像画面。信噪比与图像质量之间具有如下对应关系:
S/N为60dB(比率为1000:1)时,图像质量优良,不出现噪声;
S/N为50dB(比率为316:1)时,图像有少量噪声,但图像质量算好;
S/N为40dB(比率为100:1)时,图像有一定的精细颗粒或雪花,图像的精细结构受到一定的损失;
S/N为30dB(比率为32:1),图像将是有大量噪声的劣质图像;
S/N为20dB(比率为10:1),图像就不能使用。
影响信噪比的因素很多,例如电源的干扰,电子元器件过热产生的干扰,光敏元件上的小电压放大成0.7V视频信号时,因放大而产生的噪声,光照度降低时,放大器增益提高,噪声也将增加等等。
一般摄像机的信噪比在50-60dB之间,录像机在40-50dB之间。
编码(Encode)
PCM数据可以理解为是:未经压缩的原始音频数据,体积比较大,为了更便于存储和传输,一般都会使用某种音频编码对它进行编码压缩,然后再存成某种音频文件格式。
压缩分为无损压缩和有损压缩。
- 无损压缩
- 解压后可以完全还原出原始数据
- 压缩比小,体积大
- 有损压缩
- 解压后不能完全还原出原始数据,会丢失一部分信息
- 压缩比大,体积小
- 压缩比越大,丢失的信息就越多,还原后的信号失真就会越大
- 一般是通过舍弃原始数据中对人类听觉不重要的部分,达成压缩成较小文件的目的
- 压缩比 = 未压缩大小 / 压缩后大小
解码(Decode)
当需要播放音频时,得先解码(解压缩)出PCM数据,然后再进行播放。
常见的音频编码和文件格式
需要注意的是:音频文件格式并不等于音频编码。比如:
- WAV只是一种文件格式,并不是一种编码
- FLAC既是一种文件格式,又是一种编码
下面对常见的音频编码和文件格式做一个简介。
名称 | 无损压缩 | 文件扩展名 |
---|---|---|
Monkey’s Audio | ✔️ | .ape |
FLAC(Free Lossless Audio Codec) | ✔️ | .flac |
ALAC(Apple Lossless Audio Codec) | ✔️ | .m4a/.caf |
MP3(MPEG Audio Layer III) | ❌ | .mp3 |
WMA(Windows Media Audio) | ❌ | .wma |
AAC(Advanced Audio Coding) | ❌ | .acc/.mp4/.m4a |
Vorbis | ❌ | .ogg |
Speex | ❌ | .spx |
Opus | ❌ | .opus |
Ogg | .ogg | |
WAV(Waveform Audio File Format) | .wav | |
AIFF(Audio Interchange File Format) | .aiff、.aif |
无损
Monkey’s Audio
Monkey’s Audio,是一种无损的音频编码和文件格式,文件扩展名为.ape,压缩率一般在55%左右。
FLAC
FLAC(Free Lossless Audio Codec),是一种无损的音频编码和文件格式,文件扩展名为.flac。虽然压缩率稍有不及Monkey’s Audio,但FLAC技术更先进,占用资源更低,有更多的平台及硬件产品支持FLAC。
ALAC
ALAC(Apple Lossless Audio Codec),是由Apple开发的一种无损的音频编码,文件扩展名为.m4a、.caf。
有损
MP3
MP3(MPEG Audio Layer III),是非常流行的一种有损音频编码和文件格式,文件扩展名为.mp3。
第1版是:MPEG-1 Audio Layer III,属于国际标准ISO/IEC 11172-3
第2版是:MPEG-2 Audio Layer III,属于国际标准ISO/IEC 13818-3
第3版是:MPEG-2.5 Audio Layer III,并不是由MPEG官方开发的,不是公认的标准
WMA
WMA(Windows Media Audio),是由Microsoft开发的音频编码和文件格式,文件扩展名为.wma。包括4种类型:
WMA:原始的WMA编解码器,作为MP3的竞争者,属于有损音频编码
WMA Pro:支持更多声道和更高质量的音频,属于有损音频编码
WMA Lossless:属于无损音频编码
WMA Voice:属于有损音频编码
AAC
AAC(Advanced Audio Coding),是由Fraunhofer IIS、杜比实验室、AT&T、Sony、Nokia等公司共同开发的有损音频编码和文件格式,压缩比通常为18:1。
AAC被设计为MP3格式的后继产品,通常在相同的比特率下可以获得比MP3更高的声音质量,是iPhone、iPod、iPad、iTunes的标准音频格式。
AAC编码的文件扩展名主要有3种:
.acc:传统的AAC编码,使用MPEG-2 Audio Transport Stream(ADTS)容器
.mp4:使用了MPEG-4 Part 14的简化版即3GPP Media Release 6 Basic(3gp6)进行封装的AAC编码
.m4a:为了区别纯音频MP4文件和包含视频的MP4文件而由Apple公司使用的扩展名
Apple iTunes对纯音频MP4文件采用了.m4a文件扩展名
M4A的本质和音频MP4相同,故音频MP4文件可以直接更改文件扩展名为.m4a
Vorbis
Vorbis,是由Xiph.Org基金会开发的一种有损音频编码。通常以Ogg作为容器格式,所以常合称为Ogg Vorbis,文件扩展名为.ogg。
Speex
Speex,是由Xiph.Org基金会开发的一种有损音频编码和文件格式,文件扩展名为.spx。
Opus
Opus,是由Xiph.Org基金会开发的一种有损音频编码和文件格式,文件扩展名为.opus。用以取代Vorbis和Speedx。经过多次盲听测试,在任何给定的比特率下都比其他标准音频格式具有更高的质量,包括MP3、AAC。
文件格式
Ogg
Ogg是一种多媒体文件格式,由Xiph.Org基金会所维护,可以纳入各式各样的音视频编码(音频、视频都可以),文件扩展名常为.ogg。
Ogg常用的音频编码有:
有损压缩:Speex、Vorbis、Opus
无损压缩:FLAC
未压缩:PCM
WAV
WAV(Waveform Audio File Format),是由IBM和Microsoft开发的音频文件格式,扩展名是.wav,通常采用PCM编码,常用于Windows系统中。
AIFF
AIFF(Audio Interchange File Format),由Apple开发的音频文件格式,扩展名是.aiff、.aif。跟WAV一样,通常采用PCM编码,常用于Mac系统中。
有损和无损
根据采样率和位深度可以得知:相对于自然界的信号,音频编码最多只能做到无限接近,任何数字音频编码方案都是有损的,因为无法完全还原。目前能够达到最高保真水平的就是PCM编码,因此,PCM约定俗成叫做无损音频编码,被广泛用于素材保存及音乐欣赏,CD、DVD以及常见的WAV文件中均有应用。
但并不意味着PCM就能够确保信号绝对保真,PCM也只能做到最大程度的无限接近。我们习惯性的把MP3列入有损音频编码范畴,是相对于PCM编码的。要做到真正的无损是困难的,就像用数字去表达圆周率,不管精度多高,也只是无限接近,而不是真正等于圆周率的值。
声波
以扬声器为例子,扬声器发声时是振膜在振动。
振膜的振动会导致振膜旁边的空气振动,然后导致更大范围的空气跟着一起振动,最后耳朵旁边的空气也开始振动。
空气的振动带来了动能(Kinetic Energy),能量传入了耳朵中,最后就听到了声音。
所以,扬声器可以通过空气来传播能量,而不是传播空气本身。
声音与波有着相同的关键特征:可以通过介质传播能量,而不是传播介质本身。
- 因此,我们也把声音称为声波
- 声音的传播介质可以是气体、液体、固体,比如:2个人面对面交流时,声音是通过空气传播到对方耳中
为什么自己录下来的声音和平时说话的声音,听起来会不太一样?
- 当自己说话的时候,实际上自己听到了2个声音,分别来自2种不同的传播介质
- 声波 → 空气 → 耳朵
- 声波 → 血肉、骨骼等介质 → 耳朵
- 录制声音时
- 声波 → 空气 → 录音设备
- 当听自己录下来的声音时,自己只听到了1个声音
- 声波 → 空气 → 耳朵
- 所以,平时别人耳中听到的你说话的声音,就是你录音中的声音
人耳又是如何听到声音的呢?
大概过程是:声源 → 耳廓(收集声波) → 外耳道(传递声波) → 鼓膜(将声波转换成振动) → 听小骨(放大振动) → 耳蜗(将振动转换成电信号) → 听觉神经(传递电信号) → 大脑(形成听觉)
如果只关注单个空气分子,可以发现:它来回振动的轨迹,就是一个正弦或余弦函数的曲线图
横轴:代表时间。
纵轴:代表空气分子来回振动时产生的位移。
平衡位置:该空气分子的未受振动干扰时的位置
从平衡位置到最大位移位置之间的距离,叫做振幅(Amplitude)。
空气分子完全来回振动一次所花费的时间,叫做周期(Period),单位是秒(s)。
物体每秒来回振动的次数,叫做频率(Frequency),也就是周期分之一。
- 单位是秒分之一(1/s),也称为赫兹(Hz)
- 比如440Hz代表物体每秒来回振动440次
- 因此,频率用来表示物体振动的快慢
理论上,人类的发声频率是85Hz ~ 1100Hz,人类只能听见20Hz ~ 20000Hz之间的声音。
- 低于20Hz的称为:次声波(Infrasound)
- 高于20000Hz的称为:超声波(Ultrasound)
音调
频率越高,音调就越高。
频率越低,音调就越低。
通常女生讲话时,声带振动的频率就比较高,因此我们听到的音调就高,而男生讲话时,声带振动的频率就比较低,因此我们听到的音调就低。
响度
当提高声音的响度(音量,大小)时,振动的幅度会变大。
我们常用dB(分贝)来描述声音的响度。
分贝 | 情景 |
---|---|
0 | 刚能听到的声音 |
15以下 | 感觉安静 |
30 | 耳语的音量大小 |
40 | 冰箱的嗡嗡声 |
60 | 正常交谈的声音 |
70 | 相当于走在闹市区 |
85 | 汽车穿梭的马路上 |
95 | 摩托车启动声音 |
100 | 装修电钻的声音 |
110 | 卡拉OK、大声播放MP3的声音 |
120 | 飞机起飞时的声音 |
150 | 燃放烟花爆竹的声音 |
音色
音色(Timbre)是指声音的特色。
- 不同的声源由于其材料、结构不同,则发出声音的音色也不同
- 我们之所以能够根据声音区分出不同的乐器、不同的人,都是因为它们的音色不同
- 不同音色的声音,即使在同一响度和同一音调的情况下,也能让人区分开来
原理
通常声源的振动产生的并不是单一频率的声波,而是由基音和不同频率的泛音组成的复合声音。
- 当声源的主体振动时会发出一个基音(基本频率,基频,Fundamental Frequency)
- 同时其余各部分也有复合的声源,这些声源组合产生泛音
- 泛音(Overtone)其实就是物理学上的谐波(Harmonic)
音调是由基音决定的,而音色主要取决于泛音。
音色不同,波形也就不同。
声音的最终波形是由多个不同的波形组合而成的。
噪音
声源作无规则振动时发出的声音
长期的噪音可以影响人的身心健康。
- 噪音可能导致各种不同程度的听力丧失
- 长时间处于85分贝以上的噪音可以影响人的听力
- 响于120分贝的噪音可以使人耳聋
研究表明:
- 让人讨厌的噪音和婴儿啼哭及人类尖叫的声音有着相同的频率
- 人耳对2000Hz ~ 4000Hz范围内的声音是难以接受的
- 而指甲刮黑板声音的特殊之处,就在于它的频率,正好处于2000Hz ~ 4000Hz频段内
大脑中的杏仁核(Amygdala)在听到指甲刮黑板的声音时,会异常兴奋,于是霸道地接管了大脑听觉的任务,向听觉皮层(Auditory Cortex)发出痛苦的信息。听觉皮层是属于大脑皮层(大脑皮质,Cerebral Cortex)的一部分。
像素
一个图的分辨率是60x50,用Photoshop放大图片上百倍后,可以清晰地看到图片由若干个方形的色块组成,每一个方形的色块被称为:像素(Pixel)。这张图片的每一行都有60个像素,共50行,总共60*50=3000个像素。
总结一下:
- 每张图片都是由N个像素组成的(N≥1)
- 如果一张图片的分辨率是WxH,那么:
- 每一行都有W个像素,共H行,总共W*H个像素
- 宽度是W像素,高度是H像素
每个像素都有自己独立的颜色,若干个像素就组成了一张色彩缤纷的完整图片。
RGB颜色模型
实验发现:太阳光通过三棱镜折射后,会被折射分散成红、橙、黄、绿、蓝、靛、紫7种单色光。其中的红、绿、蓝被称为是色光三原色。
接下来,再看一个很重要的概念:RGB颜色模型(RGB color model),又称为三原色光模式。
- 将红(Red)、绿(Green)、蓝(Blue)三原色的色光以不同的含量相叠加,可以合成产生各种色彩光
每个像素的颜色,可以通过红色、绿色、蓝色以不同的含量混合而成。比如:
- 红色(Red)、绿色(Green)可以合成:黄色(Yellow)
- 红色(Red)、蓝色(Blue)可以合成:洋红色(Magenta)
- 绿色(Green)、蓝色(Blue)可以合成:青色(Cyan)
- 红色(Red)、绿色(Green)、蓝色(Blue)可以合成:白色(White)
[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-YPGOyZWN-1634558631089)(C:\Users\jym\Desktop\497279-20210301182807299-1567553861.png)]
位深度
每一个像素的颜色信息是如何存储的呢?
- 取决于图片的位深度(Bit Depth),也称为:色彩深度(Color Depth,简称:色深)
- 如果一张图片的位深度为n,那么它的每一个像素都会使用n个二进制位来存储颜色信息
位深度是24,它的具体含义是:
- 每一个像素都会使用24个二进制位来存储颜色信息
- 每一个像素的颜色都是由红(Red)、绿(Green)、蓝(Blue)3个颜色通道合成的
- 每个颜色通道都用8bit来表示其“含量”(值),取值范围是:
- 二进制:00000000~11111111
- 十进制:0~255
- 十六进制:00~FF
- 举例:01000000 11100000 11010000(共24bit)表示绿宝石色(Turquoise)
- 红色的值:二进制01000000,十进制64,十六进制40
- 绿色的值:二进制11100000,十进制224,十六进制E0
- 蓝色的值:二进制11010000,十进制208,十六进制D0
- 64的红色 + 224的绿色 + 208的蓝色 = 绿宝石色
24bit颜色的表示形式
我们常用2种形式来表示24bit颜色,比如刚才提到的绿宝石色
- 十进制:rgb(64, 224, 208)
- 十六进制:#40E0D0
常见的24bit颜色:
- 红色:rgb(255, 0, 0),#FF0000
- 绿色:rgb(0, 255, 0),#00FF00
- 蓝色:rgb(0, 0, 255),#0000FF
- 黄色:rgb(255, 255, 0),#FFFF00
- 洋红色:rgb(255, 0, 255),#FF00FF
- 青色:rgb(0, 255, 255),#00FFFF
- 白色:rgb(255, 255, 255),#FFFFFF
- 黑色:rgb(0, 0, 0),#000000
- 当红绿蓝全为0时,就是黑色
- 这个其实很容易理解:没有任何光,自然是一片漆黑
- 所以说:黑色是世界上最纯洁的颜色,因为它啥也没有,(づ。◕ᴗᴗ◕。)づ
- 相反,白色是世界上最不纯洁的颜色,因为它啥都有,而且都是满色(全是255)
- 更多颜色,可以参考颜色对照表,红绿蓝的比例不同,合成的颜色也就不同
颜色数量
如果位深度为n,那么每一个像素能显示2n种颜色。
- 所以,位深度为24时,每一个像素能显示224种颜色,也就是16777216种颜色(约1678万)
- 24bit颜色,也被称为是:真彩色(True Color),也就是常说的24位真彩
其他位深度
除了24bit,常见的位深度还有:
- 1bit:2种颜色,黑白两色
- 3bit:8种颜色,用于大部分早期的电脑显示器,红绿蓝各占1位
- 8bit:256种颜色,用于最早期的彩色Unix工作站,红色占3位、绿色占3位、蓝色占2位
- 16bit:红色占5位、蓝色占5位、绿色占6位
- 32bit:基于24位,增加8个位的透明通道
- 可以表示带有透明度的颜色
- 比如CSS中的rgba(255, 0, 0, 0.5)表示50%透明度的红色
不同位深度的对比
位深度越大,能表示的颜色数量就越多,图片也就越鲜艳,颜色过渡就会越平滑。
格式
一说到图片,马上能想到拓展名为jpg、png、gif的图片文件。
每张图片都有自己的大小,一张图片的大小是如何计算出来的?为什么dragon01.jpg的大小是288KB?
- 要想知道一张图片的大小是多少?首先得知道每个像素的大小是多少。
- 如果位深度是n,那么每个像素的大小就是n个二进制位
分辨率是60x50,位深度是24,所以:
- 每个像素的大小是:24bit(3字节,1字节=8bit)
- 图片的理论大小是:(6050)(24/8)=9000B≈8.79KB
但实际上会发现:在相同分辨率、相同位深度的前提下,把这张图片存成2种不同的格式(jpg、png),它们的大小是不同的,而且都小于理论上的8.79KB。
其实jpg、png都是经过压缩后的图片(具体的压缩算法和原理,就不在此讨论了,大家可以到网上自行搜索),所以它们的大小会比理论值偏小。
图片的压缩类型可以分为2种:
- 无损压缩
- 不损失图片质量
- 压缩比小,体积大
- 解压(显示)后能够还原出完整的原始图片数据,不会损失任何图片信息
- 有损压缩
- 会损失图片质量
- 压缩比大,体积小
- 解压(显示)后无法还原出完整的原始图片数据,会损失掉一些图片信息
- 压缩比 = 未压缩大小 / 压缩后大小
压缩类型 | 位深度 | |
---|---|---|
JPG(JPEG) | 有损压缩 | 24bit |
PNG | 无损压缩 | 8bit、24bit、32bit |
GIF | 无损压缩 | 8bit |
众所周知,gif是一种支持动画的图片,所以一般也叫作gif动态图,微信的动态表情包就是基于gif动态图。
gif动画的实现原理类似手翻书。gif的动画原理是:
- gif内部存储了很多帧(张)静态图片
- 在短时间内,连续按顺序地呈现每一帧静态图片,就形成了动画的效果
动画
不管是gif动态图,还是手翻书,它们的动画原理其实都基于:视觉暂留(Persistence of vision)现象。
- 当人眼所看到的影像消失后,人眼仍能继续保留其影像约0.1~0.4秒左右,这种现象被称为视觉暂留现象
- 人眼观看物体时,成像于视网膜上,并由视神经输入人脑,感觉到物体的像,但当物体移去时,视神经对物体的印象不会立即消失,而要延续0.1~0.4秒的时间,人眼的这种性质被称为“眼睛的视觉暂留”
- 我们日常使用的日光灯每秒大约熄灭100余次,但我们基本感觉不到日光灯的闪动,这都是因为视觉暂留的作用
- 在一帧图片消失在大脑中之前呈现下一帧图片,反复如此,就可以形成连贯的动画效果
- 电影的帧率是24fps
- fps:每秒的帧数,Frames Per Second
YUV
YUV,是一种颜色编码方法,跟RGB是同一个级别的概念,广泛应用于多媒体领域中。
也就是说,图像中每1个像素的颜色信息,除了可以用RGB的方式表示,也可以用YUV的方式表示。
对比RGB,YUV有哪些不同和优势呢?
体积更小
- 如果使用RGB
- 比如RGB888(R、G、B每个分量都是8bit)
- 1个像素占用24bit(3字节)
- 如果使用YUV
- 1个像素可以减小至平均只占用12bit(1.5字节)
- 体积为RGB888的一半
组成
RGB数据由R、G、B三个分量组成。
YUV数据由Y、U、V三个分量组成,现在通常说的YUV指的是YCbCr。
- Y:表示亮度(Luminance、Luma),占8bit(1字节)
- Cb、Cr:表示色度(Chrominance、Chroma)
- Cb(U):蓝色色度分量,占8bit(1字节)
- Cr(V):红色色度分量,占8bit(1字节)
兼容性
- Y分量对呈现出清晰的图像有着很大的贡献
- Cb、Cr分量的内容不太容易识别清楚
Y分量的内容:其实以前黑白电视的画面就是这样子。
YUV的发明处在彩色电视与黑白电视的过渡时期。
- YUV将亮度信息(Y)与色度信息(UV)分离,没有UV信息一样可以显示完整的图像,只不过是黑白的
- 这样的设计很好地解决了彩色电视与黑白电视的兼容性问题,使黑白电视也能够接收彩色电视信号,只不过它只显示了Y分量
- 彩色电视有Y、U、V分量,如果去掉UV分量,剩下的Y分量和黑白电视相同
RGB和YUV转换
公式1
Y = 0.257R + 0.504G + 0.098B + 16
U = -0.148R - 0.291G + 0.439B + 128
V = 0.439R - 0.368G - 0.071B + 128R = 1.164(Y - 16) + 2.018(U - 128)
G = 1.164(Y - 16) - 0.813(V - 128) - 0.391(U - 128)
B = 1.164(Y - 16) + 1.596(V - 128)
- RGB的取值范围是[0,255]
- Y的取值范围是[16,235]
- UV的取值范围是[16,239]
公式2
Y = 0.299R + 0.587G + 0.114B
U = 0.564(B - Y) = -0.169R - 0.331G + 0.500B
V = 0.713(R - Y) = 0.500R - 0.419G - 0.081BR = Y + 1.403V
G = Y - 0.344U - 0.714V
B = Y + 1.770U
- RGB的取值范围是[0, 1]
- Y的取值范围是[0, 1]
- UV的取值范围是[-0.5, 0.5]
公式3
Y = 0.299R + 0.587G + 0.114B
U = -0.169R - 0.331G + 0.500B + 128
V = 0.500R - 0.419G - 0.081B + 128R = Y + 1.403(V - 128)
G = Y - 0.343(U - 128) - 0.714(V - 128)
B = Y + 1.770(U - 128)
- RGB的取值范围是[0, 255]
- YUV的取值范围是[0, 255]
色度二次采样
原理
人眼的视网膜上,分布着两种感光细胞:视杆细胞和视锥细胞。
- 视杆细胞
- 感知光线的强弱
- 没有色彩识别功能
- 负责夜间非彩色视觉
- 视锥细胞
- 感知颜色
- 负责白天彩色视觉
- 如果你的视锥细胞发育不正常,数量太少,那感知颜色就会受阻,可能会导致你色弱
人眼中有上亿个感光细胞,其中视杆细胞占了95%,而视锥细胞仅占5%。
因此,人眼对亮度的敏感程度要高于对色度的敏感程度,人眼对于亮度的分辨要比对颜色的分辨精细一些。
如果把图像的色度分量减少一些,人眼也丝毫感觉不到变化和差异。
概念
如果在色度分量上进行(相对亮度分量)较低分辨率的采样,也就是存储较多的亮度细节、较少的色度细节,这样就可以在不明显降低画面质量的同时减小图像的体积。上述过程称为:色度二次采样(Chroma Subsampling)。
采样格式
采样格式通常用A:B:C的形式来表示,比如4:4:4、4:2:2、4:2:0等,其中我们最需要关注的是4:2:0。
- A:一块A*2个像素的概念区域,一般都是4
- B:第1行的色度采样数目
- C:第2行的色度采样数目
- C的值一般要么等于B,要么等于0
下图可以看出:最上面的图像颜色是下面两个图像颜色叠加。
下图可以看出 左右两个图像颜色叠加产生第三列的图像颜色
上图中,不管是哪种采样格式,Y分量都是全水平、全垂直分辨率采样的,每一个像素都有自己独立的Y分量。
4:4:4
- 第1行采集4组CbCr分量,第2行采集4组CbCr分量
- 每1个像素都有自己独立的1组CbCr分量
- Y分量与CbCr分量的水平方向比例是1:1(每1列都有1组CbCr分量)
- Y分量与CbCr分量的垂直方向比例是1:1(每1行都有1组CbCr分量)
- Y分量与CbCr分量的总比例是1:1
- 1个像素占用24bit(3字节),跟RGB888的体积一样
- 24bpp(bits per pixel)
- 这种格式是没有进行色度二次采样的
4:2:2
- 第1行采集2组CbCr分量,第2行采集2组CbCr分量
- 水平方向相邻的2个像素(1行2列)共用1组CbCr分量
- Y分量与CbCr分量的水平方向比例是2:1(每2列就有1组CbCr分量)
- Y分量与CbCr分量的垂直方向比例是1:1(每1行都有1组CbCr分量)
- Y分量与CbCr分量的总比例是2:1
- 1个像素平均占用16bit(2字节)
- 16bpp
- 因为2个像素共占用32bit(4字节 = 2个Y分量 + 1个Cb分量 + 1个Cr分量)
4:2:0
- 第1行采集2组CbCr分量,第2行共享第1行的CbCr分量
- 相邻的4个像素(2行2列)共用1组CbCr分量
- Y分量与CbCr分量的水平方向比例是2:1(每2列就有1组CbCr分量)
- Y分量与CbCr分量的垂直方向比例是2:1(每2行就有1组CbCr分量)
- Y分量与CbCr分量的总比例是4:1
- 1个像素平均占用12bit(1.5字节)
- 12bpp
- 因为4个像素共占用48bit(6字节 = 4个Y分量 + 1个Cb分量 + 1个Cr分量)
H.264编码
计算一下:10秒钟1080p(1920x1080)、30fps的YUV420P原始视频,需要占用多大的存储空间?
- (10 * 30) * (1920 * 1080) * 1.5 = 933120000字节 ≈ 889.89MB
- 可以看得出来,原始视频的体积是非常巨大的
由于网络带宽和硬盘存储空间都是非常有限的,因此,需要先使用视频编码技术(比如H.264编码)对原始视频进行压缩,然后再进行存储和分发。H.264编码的压缩比可以达到至少是100:1。
H.264,又称为MPEG-4 Part 10,Advanced Video Coding。
- 译为:MPEG-4第10部分,高级视频编码
- 简称:MPEG-4 AVC
H.264是迄今为止视频录制、压缩和分发的最常用格式。截至2019年9月,已有91%的视频开发人员使用了该格式。H.264提供了明显优于以前任何标准的压缩性能。H.264因其是蓝光盘的其中一种编解码标准而著名,所有蓝光盘播放器都必须能解码H.264。
编码器
H.264标准允许制造厂商自由地开发具有竞争力的创新产品,它并没有定义一个编码器,而是定义了编码器应该产生的输出码流。
x264是一款免费的高性能的H.264开源编码器。x264编码器在FFmpeg中的名称是libx264。
解码器
H.264标准中定义了一个解码方法,但是制造厂商可以自由地开发可选的具有竞争力的、新的解码器,前提是他们能够获得与标准中采用的方法同样的结果。
FFmpeg默认已经内置了一个H.264的解码器,名称是h264。
编码过程与原理
大体可以归纳为以下几个主要步骤:
- 划分帧类型
- 帧内/帧间编码
- 变换 + 量化
- 滤波
- 熵编码
划分帧类型
有统计结果表明:在连续的几帧图像中,一般只有10%以内的像素有差别,亮度的差值变化不超过2%,而色度的差值变化只在1%以内。
于是可以将一串连续的相似的帧归到一个图像群组(Group Of Pictures,GOP)。
GOP中的帧可以分为3种类型:
- I帧(I Picture、I Frame、Intra Coded Picture),译为:帧内编码图像,也叫做关键帧(Keyframe)
- 是视频的第一帧,也是GOP的第一帧,一个GOP只有一个I帧
- 编码
- 对整帧图像数据进行编码
- 解码
- 仅用当前I帧的编码数据就可以解码出完整的图像
- 是一种自带全部信息的独立帧,无需参考其他图像便可独立进行解码,可以简单理解为一张静态图像
- P帧(P Picture、P Frame、Predictive Coded Picture),译为:预测编码图像
- 编码
- 并不会对整帧图像数据进行编码
- 以前面的I帧或P帧作为参考帧,只编码当前P帧与参考帧的差异数据
- 解码
- 需要先解码出前面的参考帧,再结合差异数据解码出当前P帧完整的图像
- 编码
- B帧(B Picture、B Frame、Bipredictive Coded Picture),译为:前后预测编码图像
- 编码
- 并不会对整帧图像数据进行编码
- 同时以前面、后面的I帧或P帧作为参考帧,只编码当前B帧与前后参考帧的差异数据
- 因为可参考的帧变多了,所以只需要存储更少的差异数据
- 解码
- 需要先解码出前后的参考帧,再结合差异数据解码出当前B帧完整的图像
- 编码
不难看出,编码后的数据大小:I帧 > P帧 > B帧。
GOP的长度
GOP的长度表示GOP的帧数。GOP的长度需要控制在合理范围,以平衡视频质量、视频大小(网络带宽)和seek效果(拖动、快进的响应速度)等。
- 加大GOP长度有利于减小视频文件大小,但也不宜设置过大,太大则会导致GOP后部帧的画面失真,影响视频质量
- 由于P、B帧的复杂度大于I帧,GOP值过大,过多的P、B帧会影响编码效率,使编码效率降低
- 如果设置过小的GOP值,视频文件会比较大,则需要提高视频的输出码率,以确保画面质量不会降低,故会增加网络带宽
- GOP长度也是影响视频seek响应速度的关键因素,seek时播放器需要定位到离指定位置最近的前一个I帧,如果GOP太大意味着距离指定位置可能越远(需要解码的参考帧就越多)、seek响应的时间(缓冲时间)也越长
GOP的类型
GOP又可以分为开放(Open)、封闭(Closed)两种。
- Open
- 前一个GOP的B帧可以参考下一个GOP的I帧
- Closed
- 前一个GOP的B帧不能参考下一个GOP的I帧
- GOP不能以B帧结尾
需要注意的是:
- 由于P帧、B帧都对前面的参考帧(P帧、I帧)有依赖性,因此,一旦前面的参考帧出现数据错误,就会导致后面的P帧、B帧也出现数据错误,而且这种错误还会继续向后传播
- 对于普通的I帧,其后的P帧和B帧可以参考该普通I帧之前的其他I帧
在Closed GOP中,有一种特殊的I帧,叫做IDR帧(Instantaneous Decoder Refresh,译为:即时解码刷新)。
- 当遇到IDR帧时,会清空参考帧队列
- 如果前一个序列出现重大错误,在这里可以获得重新同步的机会,使错误不会继续往下传播
- 一个IDR帧之后的所有帧,永远都不会参考该IDR帧之前的帧
- 视频播放时,播放器一般都支持随机seek(拖动)到指定位置,而播放器直接选择到指定位置附近的IDR帧进行播放最为便捷,因为可以明确知道该IDR帧之后的所有帧都不会参考其之前的其他I帧,从而避免较为复杂的反向解析
帧内/帧间编码
I帧采用的是帧内(Intra Frame)编码,处理的是空间冗余。
P帧、B帧采用的是帧间(Inter Frame)编码,处理的是时间冗余。
划分宏块
在进行编码之前,首先要将一张完整的帧切割成多个宏块(Macroblock),H.264中的宏块大小通常是16x16。
宏块可以进一步拆分为多个更小的变换块(Transform blocks)、预测块(Prediction blocks)。
- 变换块的尺寸有:16x16、8x8、4x4
- 预测块的尺寸有:16×16、16×8、8×16、8×8、8×4、4×8、4×4
帧内编码
帧内编码,也称帧内预测。以4x4的预测块为例,共有9种可选的预测模式。
利用帧内预测技术,可以得到预测帧,最终只需要保留预测模式信息、以及预测帧与原始帧的残差值。
编码器会选取最佳预测模式,使预测帧更加接近原始帧,减少相互间的差异,提高编码的压缩效率。
帧间编码
帧间编码,也称帧间预测,用到了运动补偿(Motion compensation)技术。
编码器利用块匹配算法,尝试在先前已编码的帧(称为参考帧)上搜索与正在编码的块相似的块。如果编码器搜索成功,则可以使用称为运动矢量的向量对块进行编码,该向量指向匹配块在参考帧处的位置。
在大多数情况下,编码器将成功执行,但是找到的块可能与它正在编码的块不完全匹配。这就是编码器将计算它们之间差异的原因。这些残差值称为预测误差,需要进行变换并将其发送给解码器。
综上所述,如果编码器在参考帧上成功找到匹配块,它将获得指向匹配块的运动矢量和预测误差。使用这两个元素,解码器将能够恢复该块的原始像素。
如果一切顺利,该算法将能够找到一个几乎没有预测误差的匹配块,因此,一旦进行变换,运动矢量加上预测误差的总大小将小于原始编码的大小。
如果块匹配算法未能找到合适的匹配,则预测误差将是可观的。因此,运动矢量的总大小加上预测误差将大于原始编码。在这种情况下,编码器将产生异常,并为该特定块发送原始编码。
变换与量化
接下来对残差值进行DCT变换(Discrete Cosine Transform,译为离散余弦变换)。
规格
H.264的主要规格有:
- Baseline Profile(BP)
- 支持I/P帧,只支持无交错(Progressive)和CAVLC
- 一般用于低阶或需要额外容错的应用,比如视频通话、手机视频等即时通信领域
- Extended Profile(XP)
- 在Baseline的基础上增加了额外的功能,支持流之间的切换,改进误码性能
- 支持I/P/B/SP/SI帧,只支持无交错(Progressive)和CAVLC
- 适合于视频流在网络上的传输场合,比如视频点播
- Main Profile(MP)
- 提供I/P/B帧,支持无交错(Progressive)和交错(Interlaced),支持CAVLC和CABAC
- 用于主流消费类电子产品规格如低解码(相对而言)的MP4、便携的视频播放器、PSP和iPod等
- High Profile(HiP)
- 最常用的规格
- 在Main的基础上增加了8x8内部预测、自定义量化、无损视频编码和更多的YUV格式(如4:4:4)
- High 4:2:2 Profile(Hi422P)
- High 4:4:4 Predictive Profile(Hi444PP)
- High 4:2:2 Intra Profile
- High 4:4:4 Intra Profile
- 用于广播及视频碟片存储(蓝光影片),高清电视的应用
部分内容来自网络以及参考https://www.cnblogs.com/mjios/p/14810630.html