数字音频概念
以数字形式表示音频涉及许多步骤和过程,原始音频和网络上实际使用的编码或压缩音频都有多种格式可用。本指南概述了数字音频的表示方式,以及如何使用编解码器对音频进行编码和解码以供网络使用。
音频采样
音频是自然界固有的模拟特征。当一个物体振动时,它会引起周围分子也振动。这些分子影响相邻的分子,以此类推,以波的形式从声源向外传播振动,直到波的振幅(其音量)随距离衰减。因此,真实世界中声波的粒度是声波传播介质中单个分子的粒度。
在地球上,大多数音频传播的介质是空气。有些音频确实通过水传播,甚至通过构成地球本身的岩石传播(如果你曾听到过地震的轰鸣声或隆隆声,你就经历过这种现象),但你每天听到的大部分声音都是通过空气传播到你的耳朵的。
因此,一个人每天听到的声音实际上是空气中的振动,这些振动引起耳朵内部的运作。空气分子随波的每个脉冲移动得越远,波的振幅就越高,声音就越大。分子振动得越快,波的频率就越高。
波的振幅(高度)越高,该瞬间的声音就越大。波长越短(波峰越接近),产生的声音的频率(或音高)就越高。
然而,计算机是数字的。为了以计算机能够处理和操作(更不用说通过网络传输)的方式表示声波,声音必须转换为数字形式。这个过程称为模拟到数字转换(简称A/D)。
影响捕获音频保真度的第一个因素是音频带宽;也就是说,A/D 转换器能够捕获并转换为数字形式的音频频率范围。如果编解码器在编码声音时选择丢弃任何频段,音频带宽也会受到影响。
声音以电子流的形式通过麦克风或其他输入设备进入计算机,其电压变化代表声波的振幅。然后,这个模拟信号通过一个电路转换为数字形式,该电路以规律的间隔捕获传入波的振幅,并将这些数据转换为音频录制系统能够理解的数字形式。这些捕获的时刻中的每一个都称为采样。通过将所有采样串联起来,可以近似表示原始波形,如下图所示。
在此示例中,蓝色线条代表从黑色音频波形中获取的采样。A/D 转换器电路以规律的间隔读取信号的电压,其值介于(在此示例中)-1.0 和 +1.0 之间。由于振幅在该时间片的持续时间内发生变化,A/D 转换器必须选择一个值来表示该时间片,无论是通过在特定时刻取值(在上图中,每个时间片的中间点用作值),还是通过对每个采样的持续时间内的振幅进行平均。然后,这些采样值被记录为该时刻波形的振幅。
当稍后播放该声音时,这些振幅用于生成原始波形的近似值;不是播放原始平滑波的精确副本,而是播放粗糙的蓝色波。
你对原始音频进行采样的频率越高,就能越接近原始音频。每秒采样的次数称为采样率。考虑上面的波形,如果你采样频率是现在的两倍,或者十倍,那么蓝色数字波形会看起来有多么不同。你采样的次数越多,波形就越平滑。
音频数据格式和结构
在最基本的层面上,音频由一串采样表示,每个采样指定了针对音频信号的整体波形的给定切片测量的音频波形的振幅。在音频文件中,单个采样有多种格式。大多数音频文件为每个采样使用 16 位有符号整数,但有些文件使用 32 位浮点值或 24 位或 32 位整数。一些较旧的音频文件格式(在网络上不会找到)使用 8 位整数采样。此外,采样还可以使用有符号或无符号值。单个采样的大小称为采样大小。
音频信号中每个音频源的位置称为通道。每个通道包含一个采样,指示该源在给定时刻产生的音频振幅。例如,在立体声中,有两个音频源:一个左扬声器和一个右扬声器。每个都由一个通道表示,音频信号中包含的通道数量称为通道数。
在录制或生成多声道音频文件时,这些通道被组装成一系列音频帧,每个音频帧包含音频每个通道的一个采样。单个采样是一个数值,表示单个时刻声音波形的振幅,并且可以以各种格式表示。
立体声可能是网络音频中最常用的声道排列方式,16 位采样用于当今日常使用的大多数音频。对于 16 位立体声,从模拟信号中采集的每个采样都记录为两个 16 位整数,一个用于左声道,一个用于右声道。这意味着每个采样需要 32 位内存。在常用的 48 kHz 采样率(每秒 48,000 个采样)下,这意味着每秒音频占用 192 KB 内存。因此,一首典型的三分钟歌曲大约需要 34.5 MB 内存。这需要大量的存储空间,更糟糕的是,对于相对较短的音频片段来说,它会消耗大量的网络带宽。这就是为什么大多数数字音频都要进行压缩。
音频的压缩和解压缩过程通过使用音频编解码器(COder/DEcoder)进行编码和解码来完成。多年来,已经开发了各种编解码器,其中有几种在网络上常用。有关网络开发者需要熟悉的最重要和最有用的编解码器的详细信息,请参阅文章网络上使用的音频编解码器指南。
音频通道和帧
有两种类型的音频通道。标准音频通道用于呈现大部分可听声音。左右主通道以及所有环绕声扬声器(中置、左右后置、左右侧、天花板通道等)的声音都是标准音频通道。特殊的低频增强(LFE)通道为旨在产生低频声音和振动的特殊扬声器提供信号,以便在聆听音频时产生内脏感。LFE 通道通常驱动低音炮和类似设备。
单声道音频有一个声道,立体声有两个声道,5.1 环绕声有 6 个声道(五个标准声道和一个 LFE 声道),以此类推。每个音频帧是一个数据记录,其中包含音频信号中所有可用声道的采样。音频帧的大小通过将采样大小(以字节为单位)乘以声道数来计算,因此单个立体声 16 位音频帧的长度为 4 字节,单个 5.1 浮点音频帧的长度为 24 字节(每采样 4 字节乘以 6 个声道)。
注意:有些编解码器实际上会分离左右声道,将它们存储在数据结构内的独立块中。但是,一个音频帧始终包含所有可用通道的所有数据。
组成一秒音频的帧数取决于录制声音时使用的采样率。由于采样率对应于每秒声波被分成“切片”的数量,因此有时被认为是频率(从它描述周期性重复的事物的意义上说,而不是实际音频频率的意义上说),因此每秒采样量度使用赫兹作为其单位。
最常见的采样率是
- 8000 赫兹
-
用于电话的国际 G.711 音频标准使用 8000 Hz (8 kHz) 的采样率。这足以使人类语音可以理解。
- 44100 赫兹
-
44.1 kHz 采样率用于光盘 (CD) 音频。CD 提供 44.1 kHz 的未压缩 16 位立体声。计算机音频也经常默认使用此频率。
- 48000 赫兹
-
DVD 上的音频以 48 kHz 录制。这也常用于计算机音频。
- 96000 赫兹
-
高分辨率音频。
- 192000 赫兹
-
超高分辨率音频。目前尚未普遍使用,但这种情况会随着时间而改变。
44.1 kHz 被认为是最低的“高保真”采样率是有原因的。奈奎斯特-香农采样定理规定,为了准确再现声音,必须以声音频率的两倍速率进行采样。由于人耳的听力范围约为 20 Hz 到 20,000 Hz,因此再现人类通常能听到的最高音调声音需要超过 40,000 Hz 的采样率。
为了给低通滤波器提供额外的空间,以避免混叠引起的失真,在预采样频率上增加了一个额外的 2.05 kHz 的过渡带(导致 22,050 Hz)。根据奈奎斯特定理将其加倍,最终最小频率为(你猜对了)44.1 kHz。
高分辨率(96 kHz)音频用于一些高端音频系统,它和超高分辨率(192 kHz)音频对于音频母带处理很有用,在母带处理中,你需要尽可能高的质量来操作和编辑声音,然后再下采样到你将用于最终产品的采样率。这类似于摄影师如何使用高分辨率图像进行编辑和合成,然后向客户展示适合在网站上使用的 JPEG。
音频文件大小和网络带宽
一旦你知道单个音频帧的大小以及每秒音频数据包含多少帧,你就可以轻松计算原始声音数据本身将占用多少空间(因此它会在网络上消耗多少带宽)。
例如,考虑一个立体声音频片段(即两个音频通道),采样大小为 16 位(2 字节),以 48 kHz 录制
在 192 kBps 的速度下,低端网络仅播放单个音频流就会受到影响。如果网络还在做其他事情,即使在更高带宽的网络上也会出现问题。由于网络容量竞争激烈,尤其是在较慢的网络上,如此大的数据量可能难以在任何实时应用程序中进行有效传输。
为了解决这个问题,音频必须通过压缩变小。
注意:网络带宽显然与上述音频采样中讨论的音频带宽不同。
音频压缩基础
与文本和许多其他类型的数据不同,音频数据往往是嘈杂的,这意味着数据很少由一系列精确重复的字节或字节序列组成。因此,音频数据很难使用传统算法进行压缩,例如通用工具(如zip
)使用的算法,这些算法通常通过用速记表示替换重复数据序列来工作。
在压缩音频时可以应用多种技术。大多数编解码器结合使用这些技术,也可能使用其他技术。
最简单的方法是应用一个过滤器,去除嘶嘶声和微弱的声音,将任何微弱的部分转换为静音并平滑信号。这可以产生静音片段以及其他可以缩短的重复或近乎重复的信号。
你可以应用一个过滤器来缩小音频带宽,去除任何你不在意的音频频率。这对于仅包含语音的音频信号特别有用。这样做可以去除数据,使生成的信号更容易压缩。
心理声学
如果你知道你最可能处理的音频类型,你可能会找到专门适用于那种声音的特殊滤波技术,从而优化编码。
最常用的音频压缩方法是应用心理声学科学。这门科学研究人类如何感知声音,以及在给定声音的上下文和内容的情况下,我们听到的音频频率的哪些部分对我们对这些声音的反应最重要。诸如感知声音频率变化的能力、人耳听觉的整体范围与音频信号的频率、声音定位等因素都可以被编解码器考虑。
通过对心理声学有深入的了解(并非双关语),可以设计一种压缩方法,在最大程度地降低音频压缩大小的同时,最大限度地提高声音的感知保真度。采用心理声学算法可能会使用此处提到的任何技术,并且几乎肯定会应用其他技术。
所有这些都意味着在选择编解码器之前必须提出并回答一个基本问题:给定声音的内容、使用上下文和目标受众,是否可以接受在一定程度上损失音频保真度,如果可以,损失多少;或者是否有必要在解码数据后,结果与源音频完全相同?
有损与无损压缩
如果细节和潜在保真度的损失是不可接受或不希望的,则首选无损编解码器。另一方面,如果一定程度的音频保真度降低是可以接受的,则可以使用有损编解码器。通常,有损压缩比无损压缩方法产生显著更小的输出;此外,许多有损编解码器非常优秀,对于普通听众来说,质量和细节的损失很难甚至不可能辨别。
注意:虽然高质量有损压缩算法对音质的影响可能很难被普通人察觉,但某些人听力异常好,或者特别擅长注意到有损压缩技术对音乐引入的变化。
大多数音频编解码器采用某种形式的有损压缩,因为这些算法提供了更好的压缩比。无损压缩算法通常无法将原始未压缩声音数据的大小压缩到 40-50% 以下,而现代有损压缩算法可以将音频大小减小到原始大小的 5-20%,具体取决于音频的复杂性。有损压缩可能实现的巨大优越的压缩比通常使其成为一个引人注目的选择,并且通过精心选择的编解码器配置可以实现足够或出色的音频质量。
研究人员正在不断设计更好的音频分析和压缩方法,因此新格式会定期发布,在压缩比或音频保真度(或两者)方面提供各种改进。
无损音频的用例包括以下场景:
- 听众期望精确的音频再现,并且听力足够好,能够分辨未经处理的音频的复杂细节的任何情况
- 音乐和音效制作中使用的音频循环和采样
- 音频剪辑或采样可能被重新混合然后压缩的情况;在母带处理过程中使用无损音频可以避免压缩先前压缩的数据,从而导致额外的质量损失
可能推荐使用有损压缩的因素包括
- 非常大的源音频
- 受限存储(要么因为存储空间小,要么因为有大量声音需要存储)
- 需要限制广播音频所需的网络带宽;这对于直播流和电话会议尤为重要
心理声学入门
深入研究心理声学和音频压缩的工作原理超出了本文的范围,但对常见算法如何压缩音频有一个大致的了解有助于理解和做出更好的音频编解码器选择。
有损压缩算法通常利用心理声学来确定音频波形的哪些组件可以丢失或以某种方式减弱,以提高压缩比,同时最大限度地减少对目标听众的可听影响。通过操纵波形使其更容易压缩,或通过去除那些实际上听不到的声音组件,波形变得更简单,从而产生具有更高一致性且因此更容易压缩的数据。将音频带宽限制为仅包含对人耳解释解码声音最重要的频率,也可以改善压缩因子。
编码内容的类型会影响编解码器的选择。特别是,音乐的波形几乎总是比仅包含人声的音频采样的波形更复杂。此外,人声只使用了人耳可以检测到的音频频率范围的一小部分。
注意:电话网络最初是专门为传输人声而设计的,只能在 300 Hz 到 3,000 Hz 的频段内传输音频(或任何其他类型的信号)。这并没有完全覆盖人声低端的整个范围,但波形足够,人耳和大脑很容易补偿。这也意味着人类通常习惯于听到受限于如此窄音频带宽的语音。
人声使用相对较窄的频带(大约 300 赫兹到 18,000 赫兹,尽管确切范围因人而异,受性别等因素影响)。此外,绝大多数人声倾向于介于 500 赫兹和 3,000 赫兹左右,因此可以丢弃大部分整体波形,而不会影响听者理解所说单词的能力。你甚至可以调整音频带宽以考虑单个说话者声音的音高。
由于所有这些因素,以及语音波形通常比音乐复杂程度低,因此可以在相对较低的比特率下实现高保真度(更具体地说,“足够高”)的语音再现。
当为压缩通用音频而设计的压缩算法分析音频波形时,它可以丢弃人耳听力范围之外的任何声音(或者甚至更多,这取决于算法愿意冒多大风险丢失频段高频和/或低频端的细节)。这意味着编解码器可以丢弃频率低于约 20 Hz 或高于约 20,000 Hz(20 kHz)的音频。这会缩小声音的音频带宽,从而减少以压缩形式表示信号所需的数据量。音频带宽不能像仅用于语音的编解码器那样大幅减小,但它仍然是一个有用的开始。
有些人可以在一定程度上听到这个范围之外的声音。更常见的是,人们听到高频的能力要低于这个范围;特别是,值得注意的是,到中年时,该频率范围的高端通常从 20 kHz 下降到大约 12 kHz 到 14 kHz。这表明高频通常可以在不过度影响声音可理解性的情况下被丢弃,因此你可以大幅减少需要保留的音频空间,从而使你的声音更简单,更容易压缩。
如下图所示。该图比较了人耳听觉的频率范围(绿色)与人声的频率范围(红色)以及绝大多数人类发声所在的频率范围(黄色)。
这些范围之间的巨大差异为我们在不显著影响人耳感知音频质量任何实际变化的情况下丢失音频数据细节提供了空间。这些事实可以在压缩音频时加以利用。
除了通过心理声学分析简化声音之外,编解码器还使用其他算法和变换来进一步简化和减小音频大小。如果你想了解更多关于音频压缩工作原理的信息,请参阅维基百科上的音频数据压缩。
重要的是,编解码器为你完成了所有繁重的工作。这就是为什么大量工程和科学研究都投入到新算法和编解码器的创建中。你所需要做的就是考虑选项和你的用例,然后选择适合你需求的编解码器。
注意:有关选择音频编解码器的更详细指南,请参阅选择音频编解码器。
无损编码器参数
考虑到需要能够重现原始音频,无损编码器在操纵音频以提高压缩率方面的空间要小得多,这限制了可配置这些编码器的选项数量。这些选项往往围绕着选择编码器执行编码的方法以及它被允许消耗多少时间和处理器能力来完成此操作。
这些参数因编解码器而异,但可以包括
- 在编码过程的特定阶段指定要使用的特定算法
- 用于这些算法的参数,例如在尝试建模音频时使用的预测深度
- 分析音频时进行的遍数,或给定算法应运行的次数
有损编码器参数
大多数编解码器都有你可以调整的输入值,以各种方式优化压缩,无论是为了大小还是为了质量。使用有损编码器时,质量越高,编码后的音频就越大。因此,大多数选项都会以某种方式影响质量和大小。
你需要参考你使用的编码软件的文档来确定哪些选项可用,这取决于编解码器和编码软件本身。有些编解码器有许多你可以调整的值(其中一些可能需要对心理声学和编解码器算法有深入的了解),还有一些编解码器提供一个你可以设置的“质量”参数,该参数会自动调整算法的各种属性。
比特率
有两种互斥的方式可以通过比特率控制压缩音频的质量。第一种是针对编码数据的平均比特率,而第二种是指定一个恒定质量值,同时允许比特率变化。
平均比特率
控制输出文件质量的第一种方法是指定在编码音频时要达到的平均比特率(ABR)。编码器将尝试生成一个编码后的声音文件,在播放时,该文件平均每秒音频使用指定数量的比特。这从编码音频大小的角度控制质量;比特率越高,生成的音频质量就越高。音频的质量会随着时间波动,以满足目标比特率。
与 ABR 有些类似的是 CBR(恒定比特率)。ABR 尝试平均保持比特率在给定水平,同时允许一些波动,而 CBR 在音频持续时间内使用实际固定的比特率。CBR 主要用于仅限语音用途的编解码器,其中频率范围和变化往往最小,从而允许 CBR 编码在音频质量没有不可行的波动的情况下工作。
可变比特率
可变比特率(VBR)编码的工作原理是接受一个恒定质量设置作为编码器的输入。这表示在音频持续时间内保持的质量级别,允许比特率根据需要波动以达到该质量级别。在声音中容易以最小质量影响实现压缩的部分,比特率可能非常低,而在压缩更复杂的区域,比特率会更高。
音频频率带宽
有些编解码器允许你直接配置音频频率带宽,方法是指定允许的频率范围、设定上限和/或下限频率,或者指定音频源类型,该类型根据传入信号的预期频率使用情况确定如何配置算法。
此外,一些编解码器支持特殊的有限频率带宽通道,例如 LFE 通道,其固有地限制了可用频率范围。在 LFE 的情况下,音频频率带宽被限制在适合低音炮或类似音频体验增强设备使用的频率范围内。
有些编解码器提供专门用于特定使用场景(例如 VoIP)的特殊配置文件;这些配置文件默认情况下也可能包含对音频频率带宽的限制。
联合立体声
立体声通常由包含每个声道一个采样的音频帧表示。这导致音频帧需要 2 倍*采样大小*位,其中*采样大小*是每个音频采样所占用的位数。因此,对于 16 位立体声录音,每个采样使用 2 乘以 16,即 32 位空间。这是标准的左/右 (L/R) 立体声或简单立体声。
联合立体声是一种以更节省空间的方式存储立体声音频采样的方法,它考虑到通常进入每只耳朵的声音是相似的。因此,不是存储每个声道采样的每个位,而是存储一个基本振幅值和每个声道的振幅偏差值,其中偏差值可能使用比完整采样更少的位。
联合立体声有两种类型:中-侧和强度。在音频文件持续期间,编码器可能会改变用于表示音频文件立体声信号的格式。
中-侧立体声编码
中-侧立体声编码(MS)的工作原理是记录包含基本中置声道的帧,该声道是原始左右音频声道的平均振幅。这基本上就是将立体声信号转换为单声道时计算出的振幅。然后你存储侧声道值;这个值是一个数字,可以加到中置声道值中以确定左声道的原始振幅,并从中置声道值中减去以计算右声道的原始值。
换句话说,给定左声道 L 和右声道 R,在编码采样时执行以下计算
然后你存储 mid
和 side
的值。虽然 mid
的大小仍然与你的采样大小相同(例如 16 位),但 side
的值可能可以存储在更少的位中,因为两个声道的振幅可能相对相似。然后编码器可以获取每帧更小的总位数,并执行额外的计算以进一步减小大小。
解码音频时,左右声道绝对值计算如下:
中-侧立体声编码本身是无损的,通常被无损和有损音频编解码器使用。任何细节损失都来自编码过程的其他步骤。
强度立体声编码
强度立体声编码通过利用人类确定声音空间位置的方式来降低编码音频比特率;这称为声音定位。我们听到立体声是因为我们的耳朵根据声音来源的不同时间检测到声音。
这是因为我们的耳朵由于位于头部的两边而相隔数英寸。来自我们右侧的声音会比到达我们左耳更早到达我们右耳。我们的大脑通过使用这个时间差来计算声音的来源角度,从而确定声音在我们周围空间中的位置。然而,随着音频信号频率的下降,波长会增加。最终,波长接近然后超过耳朵之间的距离,并且变得难以或不可能明确地定位声音。
有了这些信息,我们可以通过将那些不用于确定方向性的频率合并到一个通道中,然后包含指示声音方向性的信息,来近似表示立体声音频信号。这需要更少的比特来表示,但本质上是有点有损的。