音视频之所以叫音视频是因为他由音频和视频构成,我们平时看的视频其实就是音视频。本文将记录笔者在学习音视频遇到的概念,如果你和笔者一样对音视频并没有接触太多,那么下面的笔记将会帮你认识音视频。
音频
声波
-
频率:频率代表音阶的高低
- 频率(Hz)越高,波长越短
- 频率越低,波长越长
- 波长越长,声音更容易绕过障碍物,传得越远
-
振幅:振幅代表响度,响度就是能量大小的反应
- 分贝(dB)是描述响度大小(声音强度)的单位
- 分贝是无量纲,指两个相同的物理量A1(被量度量)和A0(基准量或参考量)之比取以10为底的对数并乘以10(或20),即
-
波形:波形代表音色
- 音色不同的情况下,在同样的音调(频率)和响度(振幅)下声音也是不同
-
声压:声波通过媒质时,由振动所产生的压强改变量
- 声压的衡量单位是帕斯卡(Pa)
-
声压级:指以对数尺衡量有效声压相对于一个基准值的大小
- 分贝(dB)描述声压值与基准值的关系,变化范围大,可以达到六个数量级以上
- 在声压级较低时,听觉的频率特性会很不均匀
- 在声压级较高时,听觉的频率特性会变得较为均匀
人耳
- 能听到的频率范围:20Hz ~ 20kHz
- 较敏感频率范围:3 ~ 4kHz
- 频率较宽的音乐声压:80 ~ 90dB 为最佳,超过 90dB 将会损害人耳
- 人耳极限:105dB
- 两种声音传到我们耳朵的时差小于80ms,我们就无法区分两种声音
数字音频
为了将音频信号数字化,需要进行采样、量化和编码三个步骤。
-
采样:采样是在时间轴上对信号进行数字化。根据奈奎斯特定理(也称采样定理),按比声音最高频率2倍以上的频率对声音进行采样(也称为AD转换)
- 采样频率(采样率):表示一秒中采样的次数,采样率一般为44.1kHz
- 量化:量化是指在幅度轴上对信号进行数字化,比如用 16 比特的二进制信号来表示声音的一个采集,而16 比特(一个short)所表示的范围是[-32768, 32767],共有 65536 个可能取值,因此最终的音频信号在幅度上也分为 65535 层
- 编码:按照一定的格式记录采样和量化的数字数据
描述概念
-
量化格式(sampleFormat):也叫位深度,是音频采样一次所需要的容量
- 单位:bit、byte
-
采样率(sampleRate):
- 单位:Hz、kHz
- 声道数(channel)
-
比特率(码率)(bit rate):1秒时间内的比特数目,用于衡量音频数据单位时间内的容量大小。比特率越高,存储越大,声音细节越精确
- 单位:bps、kbps
- 低码率()
- 中码率()
- 高码率()
音质 | 量化格式(位深) | 采样率 | 声道数 | 比特率 | 存储空间(1分钟) |
---|---|---|---|---|---|
CD 音质 | 16比特(2 字节) | 44100Hz | 2 | 1378.125kbps | 10.09MB |
音频编码
PCM 即音频裸数据量大,存在本地稍微可以接受,但是要在网络中实时在线传播的话就太大了,因此就有了音频压缩编码的存在。压缩编码实际上就是压缩冗余信号,冗余信号指的是人耳听不到的音频信号(20Hz ~ 20kHz范围以外)。
常见概念
- 压缩比:通常小于1
- 无损压缩:解压后数据可以完全复原
- 有损压缩:解压后数据不能完全复原,压缩比越小,丢失信息越多,信号还原后的失真就会越大
PCM 编码
PCM(Pulse Code Modulation,脉冲编码调制)是无损编码,也是音频裸数据,能够达到最大程度的高保真。
优点:音源信息保存完整,音质好
缺点:信息量大,体积大,冗余度过大
适用场合:广泛用于素材保存及音乐欣赏
WAV 编码
WAV(Waveform Audio File Format)是一种不会进行压缩操作的编码,他在 PCM 数据格式的前面加上了44字节,分别用来描述 PCM 的采样率、声道数、数据格式等信息。
优点:音质非常好,大量软件都支持
缺点:信息量大,体积大,冗余度过大
适用场合:多媒体开发的中间文件、保存音乐和音效素材
MP3 编码
MP3 具有不错的压缩比,使用 LAME 编码的中高码率的 MP3 文件,听感上非常接近 WAV 文件。
优点:音质在 128 Kbps 以上表现还不错,压缩比比较高,兼容性高
缺点:在 128 Kbps 及以下时,会出现明显的高频丢失
适用场合:高比特率下对兼容性有要求的音乐欣赏
AAC 编码
AAC 是新一代的音频有损压缩技术,它通过一些附加的编码技术(比如PS、SBR等),衍生出了 LC-AAC、HE-AAC、HE-AAC v2 三种主要的编码格式:
- LC-AAC:主要应用于中高码率场景的编码()
- HE-AAC:(相当于AAC+SBR)主要应用于中低码率场景的编码()
-
HE-AAC v2:(相当于AAC+SBR+PS)主要应用于低码率场景的编码()
- 事实上大部分编码器都设置自动启动 PS 技术,而则不加 PS ,相当于普通的 HE-AAC
优点:在小于 128 Kbps 的码率下表现优异,支持多种音频声道组合,提供优质的音质
适用场合:128 Kbps 以下的音频编码,多用于视频中的音频轨的编码
SBR:一种音频编码增强算法,可在中低码率下增加音频的带宽或改善编码效率,但是在高码率中没什么作用。
Ogg 编码
Ogg 在各种码率下大豆油比较优秀的表现,尤其在中低码率场景下。可以用更小的码率达到更好的音质,128 Kbps 的 Ogg 比 192 Kbps 甚至更高码率的 MP3 还要出色。但是它的兼容性不是很好,因此和 MP3 无法相提并论。
优点:可用比 MP3 个更小的码率实现比 MP3 更好的音质,高低中码率下均有良好的表现
缺点:软件硬件的兼容性不好
使用场合:语音聊天的音频消息场景
图像
一幅幅图像是由一个个像素点组成的,每个像素点都由3个子像素点组成。
分辨率
像素点的数量就是分辨率,比如一个屏幕的分辨率是1280 x 720
,那么说明水平方向有 720 个像素点,垂直方向有 1280 个像素点,因此整个屏幕就有1280 x 720
个像素点(注:这是不算子像素点的说法)。
位图(Bitmap)
- 位图,又称栅格图(Raster graphics)或点阵图,是使用像素阵列(Pixel-array/Dot-matrix点阵)来表示的图像。
- 位图也可指一种数据结构,代表了有限域中的稠集(dense set),每一个元素至少出现一次,没有其他的数据和元素相关联。
位图的像素都分配有特定的位置和颜色值。每个像素的颜色信息由 RGB 组合或者灰度值表示。根据位深度,可将位图分为1、4、8、16、24及32位图像等。每个像素使用的信息位数越多,可用的颜色就越多,颜色表现就越逼真,相应的数据量越大。
位深度:表示一个位图所使用的二进制数目,即
32 位图像
能表示 种颜色的彩色图,1 位图像
就能表示 种颜色的黑白图。
RGB 表示方式
一个图像可以由 RGB 组成,这些子像素点的常用表示方式如下:
- 浮点表示:取值范围为 0.0 ~ 1.0,比如 OpenGL ES 中的子像素表示。
-
整数表示:取值范围为 0 ~ 255 或者 00 ~ FF,8 bits表示一个子像素,32 bits 即 4 bytes 就表示一个像素。
- RGBA_8888:R、G、B、A 各用 8 bits,一共 32 bits。
- RGB_565:R 用 6 bits,G 用 6 bits,B 用 5 bits,一共 16 bits 即 2 bytes
那么一张1280 x 720
的RGBA_8888
图像的大小就是:
YUV 表示方式
YUV 主要应用于优化彩色视频信号的传输,使其向后兼容老实黑白电视。与 RGB 视频型号传输相比,最大的优点是占用极少的频宽
- Y:亮度信号表示明亮度(Luminance 或 Luma),也称灰阶值
-
U、V:色度信号表示色度(Chrominance 或 Chroma),作用是描述影像的色彩及饱和度,用于指定像素的颜色(YUV也叫YCbCr)
-
色调:用
Cr
表示,反映了 RGB 输入信号红色部分与 RGB 信号亮度值之间的差异 -
饱和度:用
Cb
表示,反映了 RGB 输入信号蓝色部分与 RGB 信号亮度值之间的差异
-
色调:用
表示方式:YUV 的每个分量都使用一个字节(8位)来表示,所以取值范围是 0 ~ 255。
存储格式:
- planar 平面格式:指先连续存储所有像素点的 Y 分量,然后存储 U 分量,最后是 V 分量。
- packed 打包模式:指每个像素点的 Y、U、V 分量是连续交替存储的。
采样范式:YUV 图像的主流采样方式有如下三种:
YUV 4:4:4 采样
YUV 4:4:4 采样,意味着 Y、U、V 三个分量的采样比例相同,因此在生成的图像里,每个像素的三个分量信息完整,都是 8 bits,也就是一个字节。
如下图所示(Y 分量用叉表示,UV 分量用圆圈表示):
例子:
图像像素:[Y0 U0 V0]、[Y1 U1 V1]、[Y2 U2 V2]、[Y3 U3 V3]
采样的码流:Y0 U0 V0 Y1 U1 V1 Y2 U2 V2 Y3 U3 V3
映射出的像素点: [Y0 U0 V0]、[Y1 U1 V1]、[Y2 U2 V2]、[Y3 U3 V3]
这种采样方式的图像和 RGB 颜色模型的图像大小是一样,并没有达到节省带宽的目的,当将 RGB 图像转换为 YUV 图像时,也是先转换为 YUV 4:4:4 采样的图像。
YUV 4:2:2 采样
YUV 4:2:2 采样,意味着 UV 分量是 Y 分量采样的一半,Y 分量和 UV 分量按照 2 : 1 的比例采样。每采样过一个像素点,都会采样其 Y 分量,而 U、V 分量就会间隔一个采集一个。如下图所示(Y 分量用叉表示,UV 分量用圆圈表示):
例子:
图像像素:[Y0 U0 V0]、[Y1 U1 V1]、[Y2 U2 V2]、[Y3 U3 V3]
采样的码流:Y0 U0 Y1 V1 Y2 U2 Y3 V3
映射出的像素点: [Y0 U0 V1]、[Y1 U0 V1]、[Y2 U2 V3]、[Y3 U2 V3]
两个图像共用一个 U、V 分量,因此YUV 4:2:2 采样的图像比 RGB 模型图像节省了三分之一的存储空间,在传输时占用的带宽也会随之减少。
YUV 4:2:0 采样
YUV 4:2:0 采样,并不是指只采样 U 分量而不采样 V 分量。而是指,在每一行扫描时,只扫描一种色度分量(U 或者 V),和 Y 分量按照 2:1 的方式采样。每采样过一个像素点,都会采样其 Y 分量,而 U、V 分量就会间隔一行按照 2 : 1 进行采样。对于每个色度分量来说,它的水平方向和竖直方向的采样和 Y 分量相比都是 2:1 。如下图所示(Y 分量用叉表示,UV 分量用圆圈表示):
图像像素:
[Y0 U0 V0]、[Y1 U1 V1]、 [Y2 U2 V2]、 [Y3 U3 V3]
[Y5 U5 V5]、[Y6 U6 V6]、 [Y7 U7 V7] 、[Y8 U8 V8]
采样的码流:Y0 U0 Y1 Y2 U2 Y3 Y5 V5 Y6 Y7 V7 Y8
映射出的像素点:
[Y0 U0 V5]、[Y1 U0 V5]、[Y2 U2 V7]、[Y3 U2 V7]
[Y5 U0 V5]、[Y6 U0 V6]、[Y7 U2 V7]、[Y8 U2 V8]
四个图像共用一个 U、V 分量,因此YUV 4:2:0 采样的图像比 RGB 模型图像节省了一半的存储空间,因此它也是比较主流的采样方式。
RGB 和 YUV 的转化
RGB 到 YUV 的转换,就是将图像所有像素点的 R、G、B 分量转换到 Y、U、V 分量。对于显示器来说,它是通过 RGB 模型来显示图像的,而在传输图像数据时又是使用 YUV 模型(可节省带宽),因此就有:
- 采集图像时:将 RGB 模型转换到 YUV 模型
- 显示图像时:将 YUV 模型转换为 RGB 模型
标清电视使用标准 BT.601:
高清电视使用标准 BT.709:
图片压缩格式
-
JPEG:JPEG(
Joint Photographic Experts Group
) 是一种有损压缩格式,在提供良好的压缩性能的同时,具有较好的重建质量。一般提供压缩比的选项,压缩比越小,图片体积就越小,质量越也差,编码时间也越短,但解码时间并没有很大的差距。 -
PNG:PNG(
Portable Network Graphics
) 是无损压缩格式,其并不能提供压缩比的选项,其压缩比是有上限的。 -
BPG:BPG(
Better Portable Graphics
) 是一个优秀的有损压缩格式,它能在相同质量下比 JPEG 减少 50% 的体积。
视频
视频中的每帧都代表着一幅静止的图像
视频编码
相较于音频数据,视屏数据有极强的相关性,也就是说有大量的冗余信息,包括空间上的冗余信息和时间上的冗余信息。
帧间编码技术 -> 去除时间上的冗余信息
- 运动补偿:运动补偿是通过先前的局部图像来预测、补偿当前的局部图像,他是减少帧序列冗余的有效方法。
- 运动表示:不同区域的图像需要使用不同的运动矢量来描述运动信息。
- 运动估计:运动估计是从视频序列中抽取运动信息的一整套技术。
帧内编码技术 -> 去除空间上的冗余信息
MPEG
MPEG 算法是适用于动态视频的压缩算法,它除了对单幅图像进行编码外,还利用图像序列中的相关原则去除冗余,大大提高了视频的压缩比。
版本:Mpeg1(⽤于 VCD)、Mpeg2(⽤于 DVD)、Mpeg4 AVC(流媒体使⽤最多)
H.264
ITU-T 制定的 H.261、H.262、H.263、H.264⼀系列视频编码标准是⼀套单独的体系。其中,H.264 集中了以往标准的所有优点,并吸取了以往标准的经验,采⽤的是简洁设计,这使得它⽐ Mpeg4 更容易推⼴。现在使⽤最多的就是 H.264 标准,H.264 创造了多参考帧、多块类型、整数变换、帧内预测等新的压缩技术,使⽤了更精细的分像素运动⽮量(1/4、1/8)和新⼀代的环路滤波器,这使得压缩性能得到⼤⼤提⾼,系统也变得更加完善。
编码概念
IPB 帧
-
I帧:帧内编码帧(
intra picture
),直接表示完整图像的一帧。通常为每个GOP(MPEG所使用的一种视频压缩技术)的第一个帧。- 编码:通过视频压缩算法保存的完整一帧
- 解码:通过视频压缩算法解压成完整的画面
- 用途:作为随机访问的参考点
- 意义:去除空间冗余信息
-
P帧:前向预测编码帧(
predictive-frame
),即预测帧,通过前面的图像编码特征来确定当前的图像帧。- 编码:通过将图像序列中前面已编码帧的时间冗余信息充分去除来压缩传输数据量的编码图像。
- 解码:需要参考其前面的一个I帧或者P帧来解码成一张完整的视频画面
- 意义:去除时间冗余信息
-
B帧:双向预测内插编码帧(
bi-directional interpolated prediction frame
),即双向预测帧,需要通过前后的图像编码来确定当前帧。- 编码:既考虑源图像序列前面的已编码帧,又顾及源图像序列后面的已编码帧之间的时间冗余信息,来压缩传输数据量的编码图像
- 解码:需要参考其前一个I帧或者P帧及其后面的一个P帧来生成一张完整的视频画面
- 意义:去除时间冗余信息
IDR帧:(
instantaneous decoding refresh picture
)是一个特殊的I帧,这一帧之后的所有参考帧都只会参考到这个IDR帧,而不会再参考前面的帧。
GOP
GOP(Group Of Picture
),表示一组图片,两个I帧之间就形成的一组图片。通常在为编码器设置参数的时候,必须要设置gop_size
的值,其代表的是两个I帧之间的帧数目。
PS:提高视频质量技巧:
gop_size
越大,整个画面的质量就会越好- 多使用B帧(I的压缩率是7,P是20,B可以达到50)可节省更多的空间保存I帧。这样就能在相同的码率下提供更好的画质。
PTS 与 DTS
- DTS:(
Decoding Time Stamp
)决定解码的顺序,主要用于视频的解码 - PTS:(
Presentation Time Stamp
)决定图像什么时候显示给用户,主要用于在解码阶段进行视频的同步和输出
PS:在没有B帧的情况下,DTS 和 PTS 的输出顺序是一样的。因为B帧打乱了解码和显示的顺序,所以一旦存在B帧,PTS与DTS势必就会不同。因此需要 DTS 和 PTS 两种不同的时间戳。