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