音视频篇 - 音视频基础概念 (学习笔记)

本文章是阅读《音视频开发进阶指南基于android与ios平台的实践》一书的学习笔记。


目录:

  1. 什么是声音
  2. 声波的三要素
  3. 数字音频
  4. 音频编码
  5. 图像的物理现象
  6. YUV
  7. 视频编码
  8. 视频编码的相关概念

1. 什么是声音

声音是由物体振动而产生的。声音是一种压力波,振动时使空气产生纵波,由此产生了声波。

2. 声波的三要素

声波的三要素是频率、振幅和波形,频率代表音阶的高低,振幅代表响度,波形代表音色。

  • 频率:频率越高,波长越短。低频声响的波长则较长,所以其可以更容易地绕过障碍物,因此能量衰减就小,声音就会传得远,反之则会得到完全相反的结论。
  • 振幅:响度其实就是能量大小的反映,用不同的力度敲击桌子,声音的大小势必也会不同。在生活中,分贝常用于描述响度的大小。声音超过一定的分贝,人类的耳朵就会受不了。
  • 音色:音色其实也不难理解,在同样的音调(频率)和响度(振幅)下,钢琴和小提琴的声音听起来是完全不相同的,因为它们的音色不同。波的形状决定了其所代表声音的音色,钢琴和小提琴的音色不同就是因为它们的介质所产生的波形不同。

3. 数字音频

数字音频涉及到三个概念:采样,量化和编码。

  • 采样:采样就是在时间轴上对信号进行数字化。根据奈奎斯特定理(也称为采样定理),按比声音最高频率高 2 倍以上的频率对声音进行采样(也称为 AD 转换)。
  • 量化:量化是指在幅度轴上对信号进行数字化,比如用 16 比特的二进制信号来表示声音的一个采样,而 16 比特(一个short)所表示的范围是[-32768,32767],共有 65536 个可能取值,因此最终模拟的音频信号在幅度上也分为了 65536层。
  • 编码:所谓编码,就是按照一定的格式记录采样和量化后的数字数据,比如顺序存储或压缩存储。编码里面涉及了很多种格式,通常所说的音频的裸数据格式就是脉冲编码调制(Pulse Code Modulation,PCM)数据。描述一段 PCM 数据一般需要以下几个概念:量化格式(sampleFormat)、采样率(sampleRate)、声道数(channel)。以 CD 的音质为例:量化格式(有的地方描述为位深度)为 16 比特(2字节),采样率为44100,声道数为2,这些信息就描述了 CD 的音质。还有一个概念用来描述它的大小,称为数据比特率,即1秒时间内的比特数目,它用于衡量音频数据单位时间内的容量大小。

4. 音频编码

数据采样格式,曾计算出每分钟需要的存储空间约为 10.1 MB,如果仅仅是将其存放在存储设备(光盘、硬盘)中,可能是可以接受的,但是若要在网络中实时在线传播的话,那么这个数据量可能就太大了,所以必须对其进行压缩编码。压缩编码的基本指标之一就是压缩比,压缩比通常小于 1(否则就没有必要去做压缩,因为压缩就是要减小数据容量)。

压缩算法包括有损压缩和无损压缩。无损压缩是指解压后的数据可以完全复原。在常用的压缩格式中,用得较多的是有损压缩,有损压缩是指解压后的数据不能完全复原,会丢失一部分信息,压缩比越小,丢失的信息就越多,信号还原后的失真就会越大。

根据不同的应用场景(包括存储设备、传输网络环境、播放设备等),可以选用不同的压缩编码算法,如 PCM、WAV、AAC、MP3、Ogg 等。

压缩编码的原理实际上是压缩掉冗余信号,冗余信号是指不能被人耳感知到的信号,包含人耳听觉范围之外的音频信号以及被掩蔽掉的音频信号等。

4.1 WAV 编码

PCM(脉冲编码调制)是 Pulse Code Modulation 的缩写(音频裸数据格式)。而 WAV 编码的一种实现(有多种实现方式,但是都不会进行压缩操作)就是在 PCM 数据格式的前面加上 44 字节,分别用来描述 PCM 的采样率、声道数、数据格式等信息。

特点:音质非常好,大量软件都支持。

适用场合:多媒体开发的中间文件、保存音乐和音效素材。

4.2 MP3 编码

MP3 具有不错的压缩比,使用 LAME 编码(MP3 编码格式的一种实现)的中高码率的 MP3 文件,听感上非常接近源 WAV 文件,当然在不同的应用场景下,应该调整合适的参数以达到最好的效果。

特点:音质在 128Kbit/s 以上表现还不错,压缩比比较高,大量软件和硬件都支持,兼容性好。

适用场合:高比特率下对兼容性有要求的音乐欣赏。

4.3 AAC 编码

AAC 是新一代的音频有损压缩技术,它通过一些附加的编码技术(比如 PS、SBR 等),衍生出了 LC-AAC、HE-AAC、HE-AAC v2 三种主要的编码格式。

特点:在小于 128Kbit/s 的码率下表现优异,并且多用于视频中的音频编码。

适用场合:128Kbit/s 以下的音频编码,多用于视频中音频轨的编码。

4.4 Ogg 编码

Ogg 是一种非常有潜力的编码,在各种码率下都有比较优秀的表现,尤其是在中低码率场景下。Ogg 除了音质好之外,还是完全免费的,这为 Ogg 获得更多的支持打好了基础。Ogg 有着非常出色的算法,可以用更小的码率达到更好的音质,128Kbit/s 的 Ogg 比 192Kbit/s 甚至更高码率的 MP3 还要出色。但目前因为还没有媒体服务软件的支持,因此基于 Ogg 的数字广播还无法实现。Ogg 目前受支持的情况还不够好,无论是软件上的还是硬件上的支持,都无法和 MP3 相提并论。

特点:可以用比 MP3 更小的码率实现比 MP3 更好的音质,高中低码率下均有良好的表现,兼容性不够好,流媒体特性不支持。

适用场合:语音聊天的音频消息场景。

5. 图像的物理现象

假设一部手机屏幕的分辨率是 1280×720,说明水平方向有 720 个像素点,垂直方向有 1280 个像素点,所以整个手机屏幕就有1280×720 个像素点(这也是分辨率的含义)。每个像素点都由三个子像素点组成,这些密密麻麻的子像素点在显微镜下可以看得一清二楚。当要显示某篇文字或者某幅图像时,就会把这幅图像的每一个像素点的 RGB 通道分别对应的屏幕位置上的子像素点绘制到屏幕上,从而显示整个图像。

6. YUV

对于视频帧的裸数据表示,其实更多的是 YUV 数据格式的表示,YUV 主要应用于优化彩色视频信号的传输,使其向后兼容老式黑白电视。与 RGB 视频信号传输相比,它最大的优点在于只需要占用极少的频宽(RGB 要求三个独立的视频信号同时传输)。其中 “Y” 表示明亮度(Luminance 或 Luma),也称灰阶值;而 “U” 和 “V” 表示的则是色度(Chrominance 或 Chroma),它们的作用是描述影像的色彩及饱和度,用于指定像素的颜色。

YUV 最常用的采样格式是 4:2:0,4:2:0 并不意味着只有 Y、Cb 而没有 Cr 分量。它指的是对每行扫描线来说,只有一种色度分量是以 2:1 的抽样率来存储的。相邻的扫描行存储着不同的色度分量,也就是说,如果某一行是 4:2:0,那么其下一行就是 4:0:2,再下一行是 4:2:0,以此类推。对于每个色度分量来说,水平方向和竖直方向的抽样率都是2:1,所以可以说色度的抽样率是 4:1。对非压缩的 8 比特量化的视频来说,8×4 的一张图片需要占用 48 字节的内存。

相较于 RGB,我们可以计算一帧为 1280×720 的视频帧,用 YUV420P 的格式来表示,其数据量的大小如下:

1280 * 720 * 1 + 1280 * 720 * 0.5 = 1.318 MB

如果 fps(1 秒的视频帧数目)是 24,按照一般电影的长度 90 分钟来计算,那么这部电影用 YUV420P 的数据格式来表示的话,其数据量的大小就是:

1.318 MB * 24 fps * 90 min * 60 s = 166.8 GB

所以仅用这种方式来存储电影肯定是不可行的,更别说在网络上进行流媒体播放了,那么如何对电影进行存储以及流媒体播放呢?答案是需要进行视频编码。

7. 视频编码

音频压缩主要是去除冗余信息,从而实现数据量的压缩。那么对于视频压缩,又该从哪几方面来对数据进行压缩呢?其实与前面提到的音频编码类似,视频压缩也是通过去除冗余信息来进行压缩的。相较于音频数据,视频数据有极强的相关性,也就是说有大量的冗余信息,包括空间上的冗余信息和时间上的冗余信息。

对于视频,ISO 同样也制定了标准:Motion JPEG 即 MPEG,MPEG 算法是适用于动态视频的压缩算法,它除了对单幅图像进行编码外,还利用图像序列中的相关原则去除冗余,这样可以大大提高视频的压缩比。截至目前,MPEG 的版本一直在不断更新中,主要包括这样几个版本:Mpeg1(用于 VCD)、Mpeg2(用于 DVD)、Mpeg4 AVC(现在流媒体使用最多的就是它了)。

相比较于 ISO 制定的 MPEG 的视频压缩标准,ITU-T 制定的 H.261、H.262、H.263、H.264 一系列视频编码标准是一套单独的体系。其中,H.264 集中了以往标准的所有优点,并吸取了以往标准的经验,采用的是简洁设计,这使得它比 Mpeg4 更容易推广。现在使用最多的就是 H.264 标准,H.264 创造了多参考帧、多块类型、整数变换、帧内预测等新的压缩技术,使用了更精细的分像素运动矢量(1/4、1/8)和[…]。

8. 视频编码的相关概念

8.1 IPB 帧

视频压缩中,每帧都代表着一幅静止的图像。而在进行实际压缩时,会采取各种算法以减少数据的容量,其中 IPB 帧就是最常见的一种。

  • I 帧自身可以通过视频解压算法解压成一张单独的完整视频画面,所以 I 帧去掉的是视频帧在空间维度上的冗余信息。
  • P 帧需要参考其前面的一个 I 帧或者 P 帧来解码成一张完整的视频画面。
  • B 帧则需要参考其前一个 I 帧或者 P 帧及其后面的一个 P 帧来生成一张完整的视频画面,所以 P 帧与 B 帧去掉的是视频帧在时间维度上的冗余信息。

8.2 PTS 与 DTS

DTS 主要用于视频的解码,英文全称是 Decoding Time Stamp,PTS 主要用于在解码阶段进行视频的同步和输出,全称是 Presentation Time Stamp。在没有 B 帧的情况下,DTS 和 PTS 的输出顺序是一样的。因为 B 帧打乱了解码和显示的顺序,所以一旦存在 B 帧,PTS 与 DTS 势必就会不同,本书后边的章节里会详细讲解如何结合硬件编码器来重新设置 PTS 和 DTS 的值,以便将硬件编码器和 FFmpeg 结合起来使用。这里先简单介绍一下 FFmpeg 中使用的 PTS 和 DTS 的概念,FFmpeg 中使用 AVPacket 结构体来描述解码前或编码后的压缩数据,用 AVFrame 结构体来描述解码后或编码前的原始数据。对于视频来说,AVFrame 就是视频的一帧图像,这帧图像什么时候显示给用户,取决于它的 PTS。DTS 是 AVPacket 里的一个成员,表示该压缩包应该在什么时候被解码,如果视频里各帧的编码是按输入顺序。

猜你喜欢

转载自blog.csdn.net/u014294681/article/details/106254443