音频编码知多少?

文章目录
  1. 1. 为什么需要编码?
  2. 2. 音频格式与编码
  3. 3. 采样率
    1. 3.1. 如何选择合适的采样率?
  4. 4. 位深
  5. 5. 声道
  6. 6. 未压缩音频
    1. 6.1. 未压缩音频文件大小
  7. 7. 压缩音频
    1. 7.1. 无损压缩
    2. 7.2. 有损压缩
      1. 7.2.1. 码率/比特率
        1. 7.2.1.1. 码率与采样率、位深的关系
        2. 7.2.1.2. 码率与文件大小的关系
  8. 8. Opus 编码
    1. 8.1.
      1. 8.1.1. 帧的大小
  9. 9. 参考资料

音频编码是指将声音信号(通常是模拟信号)转换为数字数据的一种技术和过程。音频编码通过一定的算法或格式,对声音信号进行数字化处理和压缩,生成适合存储、传输或播放的音频文件。编码的核心是减少音频文件的体积,同时尽可能保留原始声音的质量。

音频编码分为采样与量化以及数据压缩两大部分。采样与量化是将将连续的模拟声音信号转换为离散的数字信号(即数字化)。采样与量化具体过程包括:

  • 采样:按固定频率(采样率)对声音信号取样。
  • 量化:将采样值映射为有限范围的数字值,量化的精度由位深(Bit Depth)决定。

数据压缩是对数字化后的音频数据进行编码以减少文件大小。数据压缩分为:

  • 无损压缩:如 FLAC、ALAC,完全保留原始音频数据。
  • 有损压缩:如 MP3、AAC,牺牲部分音质以显著降低文件大小。

为什么需要编码?

音频数据是原始的,无法直接存储和传输。需要编码成可以存储和传输的格式。音频由波形组成,包括不同频率和振幅的波的叠加。为了在数字媒体内表示这些波形,需要对波形进行采样,其采样率可以(至少)表示你要复制的最高频率的声音;同时还需要存储足够的位深来表示声音样本中波形的适当振幅(响度和柔度)。

声音处理设备重建频率的能力称为其频率响应,创造适当响度和柔度的能力称为其动态范围。这些术语通常统称为声音设备的保真度。最简单形式的编码就可以利用这两个基本原理重建声音,同时还能够高效地存储和传输数据。

音频格式与编码

音频格式并不等于音频编码。例如,像 .wav 这种常用文件格式定义了音频文件头的格式,但其本身并不是音频编码。.wav 音频文件通常使用线性 PCM 编码,音频编码信息记录在 .wav 文件头部中,头部后面的内容才是真正的音频编码内容。 .wav 头部中包含的信息格式如下所示:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
@see https://github.com/cyub/open/blob/main/audio/wav_reader/main.c#L8-L24

#pragma pack(1) // 使结构体按1字节对齐
// 定义WAV文件头结构
typedef struct {
char chunkID[4]; // "RIFF"
uint32_t chunkSize; // 文件大小 - 8
char format[4]; // "WAVE"

char subchunk1ID[4]; // "fmt "
uint32_t subchunk1Size; // fmt子块大小,PCM为16
uint16_t audioFormat; // 音频格式,PCM为1
uint16_t numChannels; // 通道数
uint32_t sampleRate; // 采样率
uint32_t byteRate; // 字节率
uint16_t blockAlign; // 块对齐
uint16_t bitsPerSample; // 位深度

char subchunk2ID[4]; // "data"
uint32_t subchunk2Size; // 音频数据的大小
} WAVHeader;

采样率

采样率(Sample Rate) 简写为 SR 或者 Fs,它是指在数字音频处理中,每秒对声音的模拟信号进行采样的次数,单位是赫兹 (Hz) 或千赫兹 (kHz)。采样率指定了(每秒)从音频的源素材中采集的样本数;采样率越高,数字音频如实表示高频的能力就越强。

根据奈奎斯特采样定理,对于你要以数字形式采集的任何声波,你的采样率通常需要高于其最高频率的两倍,才能准确地重建声音信号。例如,要表示人类听觉范围 (20-20000 Hz) 内的音频,数字音频格式必须至少每秒采样 40000 次(CD 音频使用 44100 Hz 的采样率,部分原因也在于此)。

不同的采样率会影响音质。较高的采样率可以捕捉到更多声音细节,特别是高频部分,但采样率越高,每秒需要存储的数据点越多,音频文件体积也会随之增加。较低的采样率可能导致声音失真或高频丢失。

常见采样率及用途:

采样率 频率范围 应用场景
8kHz 0-4kHz 电话音频、语音通信
16kHz 0-8kHz 高清语音、VoIP
22.05kHz 0-11.025kHz 一些低质量音频
44.1kHz 0-22.05kHz CD 音质(音乐、广播)
48kHz 0-24kHz 视频音频、电影制作
96kHz 0-48kHz 高分辨率音频
192kHz 0-96kHz 专业录音、音乐制作

如何选择合适的采样率?

  1. 平衡音质和文件大小
    较高的采样率虽然提升音质,但可能对普通用户来说效果并不明显,同时会占用更多存储空间和处理资源。

  2. 满足应用需求

    根据实际用途选择采样率。例如:

    • 对语音通信,8kHz 足够。
    • 对音乐或视频,44.1kHz 或 48kHz 是标准。
    • 对高端音频工程,可能需要 96kHz 或更高。

位深

位深(Bit Depth) 是指存储音频采样点数据的位数,即每个样本的字节数。用于描述每个采样点能够记录的振幅精度。它决定了数字音频对声音动态范围(从最轻到最响的声音)的表达能力。位深的单位是位(bits),常见的位深有 8 位、16 位、24 位或 32 位。

位深影响给定音频样本的动态范围。位深越高,表示的振幅越精确。如果在同一音频样本内有很多响亮和柔和的声音,则需要更大的位深才能正确表示这些声音。

位深影响音频的动态范围和信噪比(SNR)。更高的位深可以记录更细腻的声音细节,但同时会增加文件的大小。动态范围是指从最安静到最响亮的声音之间的差异。例如:16 位音频的动态范围是 6×16=96dB6 \times 16=96 dB

=6×=6×dB动态范围 =6×位深=6×位深(以 dB 为单位)

增高位深还会降低音频样本内的信噪比,位深越高,信号的精确度越高,噪声越小,音质越好。 CD 音乐音频使用 16 位的位深。DVD 音频使用 24 位的位深,而大多数电话设备使用 8 位的位深。

位深 动态范围 应用场景
8 位 48 dB 老式音频设备、简单语音录音
16 位 96 dB CD 音质,常见的消费级音频格式
24 位 144 dB 专业录音、音乐制作
32 位浮点 高于 144 dB 专业音频编辑和处理

声道

声道 (Audio Channel) 用于描述声音在空间中传播的路径或方向。它代表音频信号被分配到的输出路径的数量。声道数量的多少,直接影响音频的立体感和空间感。每个声道可以独立控制音量、频率和其他特性。常见的声道类型有单声道、立体声和多声道。

常见的声道类型:

声道类型 声道数量 描述 应用场景
单声道 (Mono) 1 所有声音通过一个声道播放,没有方向感。 电话、广播、语音录音
双声道/立体声 (Stereo) 2 声音分为左右两个声道,提供基本的空间感。 音乐播放、视频音频
2.1 声道 3 立体声 + 一个低音声道(低频效果)。 家庭音响、电视音响系统
5.1 声道 6 立体声 + 中置声道 + 环绕声 + 低音声道,提供环绕声体验。 影院、家庭影院
7.1 声道 8 扩展版的 5.1 声道,增加两个后环绕声道,增强空间感。 高端家庭影院、游戏音效
Atmos/DTS:X 可变 支持 3D 声场的动态声道分配,可定位声音的高度和方向。 高端影院、专业音频系统

未压缩音频

数字音频处理大多使用采样率位深这两种技术直接存储音频数据。脉冲编码调制(即 PCM)是最流行的数字音频技术(在使用光盘时较为普及)之一。音频按设定的时间间隔进行采样,采样波在采样点的振幅使用样本的位深存储为数字值。PCM 是最基本的未压缩音频格式,直接将模拟信号采样并量化为数字信号。

线性 PCM(LINEAR PCM) 是 PCM 的一种常见实现,它是 CD 使用的标准。该编码会生成一个与音频数据直接对应的未压缩字节流,它包含 16 位的位深,称为 LINEAR16。线性 PCM 在 CD 中使用 44100 Hz 的采样率,适合改编音乐;然而 16000 Hz 的采样率更适合改编语音。

线性 PCM 就是一个未压缩的音频例子,因为数字数据完全按照上述标准的规定进行存储。读取使用线性 PCM 编码的单通道字节流时,你可以每隔 16 位(2 字节)计数一次以实现某种目的,例如获得波形的另一个振幅值。几乎所有设备都可以在本地处理此类数字数据,你甚至可以使用文本编辑器裁切线性 PCM 音频文件,但(显然)未压缩音频并不是传输或存储数字音频的最高效方式。因此,大多数音频采用了数字压缩技术。

未压缩音频文件大小

对于未压缩音频文件大小,我们可以通过下面公式进行计算:

文件大小=采样率×位深×声道数×时长\text{文件大小} = \text{采样率} \times \text{位深} \times \text{声道数} \times \text{时长}

比如采样率为16Khz,时长20ms,单声道的PCM音频占用存储空间大小为:

PCM 字节数=16,000×0.02×2=640 字节\text{PCM 字节数} = 16,000 \times 0.02 \times 2 = 640 \text{ 字节}

压缩音频

与所有数据一样,音频数据通常会进行压缩,以便更易于存储和传输。音频编码中的压缩可能为无损或有损。无损压缩经过解包后可以将数字数据恢复为原始形式。有损压缩在压缩和解压缩过程中必然会移除某些信息,并且进行参数化,以便表明在多大容限范围内允许压缩技术移除数据。

音频压缩技术通常通过减少采样率、位深、采样点数或音频数据来实现。音频压缩技术分为两种:lossy 和 lossless。lossy 压缩技术会损失一些音频信息,例如音调、音色等,但压缩后的音频文件大小通常更小。lossless 压缩技术不会损失音频信息,但压缩后的音频文件大小通常更大。

无损压缩

无损压缩是音频压缩的一种方式,其特点是在减少文件体积的同时,保留音频的原始数据,不损失音质。如果采用无损压缩,在将数据解包为原始数字形式时,不会丢失任何信息。

那么,无损压缩技术为什么有时会具有优化参数?这些参数通常用来控制文件大小和解压缩时间。例如,FLAC 使用 0(最快)到 8(文件大小最小)的压缩级别参数。与较低级别的压缩相比,较高级别的 FLAC 压缩不会丢失任何信息。压缩算法只是需要在构建或解构原始数字音频时消耗更多的计算能量。

常见的无损压缩格式:

格式 全称 特点
FLAC Free Lossless Audio Codec 开源、跨平台,支持高分辨率音频,压缩比率高,广泛应用于高保真音频。
ALAC Apple Lossless Audio Codec 苹果开发的无损压缩格式,与 Apple 生态无缝集成。
WAV(无压缩) Waveform Audio File Format 虽然不是压缩格式,但经常作为无损存储音频的参考。
AIFF Audio Interchange File Format 类似 WAV 的格式,常用于 Apple 系统,支持无损音频存储。
APE Monkey’s Audio 压缩比率高,但兼容性较差,较少用于主流应用。
WavPack WavPack 支持无损和有损压缩模式,灵活性强,适合专业用户。

有损压缩

有损压缩是一种通过丢弃音频数据中不显著或人耳难以察觉的部分信息来减小文件体积的音频压缩技术。它能显著减少存储需求和传输带宽,但会以一定程度的音质损失为代价,它广泛应用于流媒体、便携设备和在线音频传输中。

有损压缩基于心理声学模型和压缩算法,从音频数据中去掉对人耳不敏感的信息,从而减少数据量。有损压缩核心原理如下:

  • 心理声学特性:
    • 听觉范围限制:丢弃超出人耳可感知频率范围(20Hz 以下和 20kHz 以上)的频率。
    • 掩蔽效应:在一个强音的附近,人耳对较弱声音的感知能力降低,因此可去除被掩蔽的弱音部分。
  • 频域分解:
    • 将音频信号分解为多个频带(如通过傅里叶变换或小波变换),对重要频带分配更多比特。
  • 量化和冗余移除:
    • 对音频数据进行量化和编码,移除冗余信息并使用高效的数据表示方式。

流行的 MP3 编解码器就是一种有损编码技术。所有 MP3 压缩技术都会移除超出正常人类音频范围的音频,并调整 MP3 编解码器的有效比特率(即每秒比特数)以存储音频数据,从而调整压缩量。

MP3 压缩会移除比特率为 320 kbps、128 kbps 或 96 kbps 的数字数据,从而导致音频质量下降。MP3 还支持可变比特率,从而进一步压缩音频。两种技术都会丢失信息且影响音频质量。例如,大多数人都可以分辨 96 kbps 与 128 kbps 编码 MP3 音乐之间的差异。

MULAW 是 8 位 PCM 编码,其中样本的振幅进行对数调制而非线性调制。因此,μ 律减小了压缩音频的有效动态范围。虽然 μ 律最初是专门为优化语音编码而引入的,与其他类型的音频形成对照,但是 16 位LINEAR16(未压缩 PCM)仍远远优于 8 位 μ 律压缩音频。

AMRAMR_WB 在源音频样本上引入可变比特率,以此调制编码音频样本。

常见的有损压缩格式:

格式 全称 特点 应用场景
MP3 MPEG Audio Layer 3 最经典的有损格式,压缩效率高,兼容性强,音质相对较低。 在线音乐、存储、流媒体
AAC Advanced Audio Coding 比 MP3 更高的压缩效率和音质,支持更高分辨率音频。 Apple 音乐、YouTube、流媒体
OGG Ogg Vorbis 开源格式,压缩效率和音质接近 AAC,但兼容性稍逊。 游戏音频、开源项目
Opus 动态调整码率,支持低延迟,适合语音和音乐的高效压缩。 VoIP、实时通信、流媒体
WMA Windows Media Audio 微软开发,音质和压缩效率高,但跨平台支持有限。 Windows 系统应用
AMR Adaptive Multi-Rate 针对语音优化,适合低码率传输和存储语音信号。 移动通信、语音留言

码率/比特率

码率(Bitrate,也称为比特率)是衡量音频数据在单位时间内传输或存储的数据量,通常以 kbps(千比特每秒) 为单位,表示每秒钟传输的比特数。

根据音频文件的编码方式和使用场景,码率可以分为以下几类:

码率率类型 特点 优点 缺点 应用场景
恒定码率(CBR) 码率固定不变,无论音频内容的复杂度如何 编码简单,文件大小可预测,解码效率高 复杂音频部分质量可能下降,简单部分浪费数据 广播、实时音频流
可变码率(VBR) 根据音频内容的复杂性动态调整码率 提高音质与文件大小的平衡,复杂部分质量更好 编码复杂度高,文件大小难以预测 音乐文件、高质量需求的流媒体
平均码率(ABR) 在整个音频文件中保持平均码率一致 提供一定质量优化,文件大小较可预测 对复杂音频的处理不如 VBR 高效 需要平衡音质和大小的场景

注意:在音频领域,码率和比特率基本可以视为一回事。但在更广泛的多媒体处理中(比如视频中),它们可能存在细微差别。

常见的音频码率及其适用场景:

码率 用途 特点
32 kbps 语音、电话音频 低质量,仅适合语音内容,细节缺失明显
64 kbps 语音广播、低质量音频流 基本可用,适合低复杂度音频内容
96 kbps 在线流媒体(低质量) 适合节省带宽的在线音频播放
128 kbps 标准音质音乐(MP3 的常见码率) 音质中等,适合普通听众
192 kbps 高音质音乐 更清晰,细节丰富,适合多数音乐欣赏
256 kbps 接近无损音质,AAC 的常见码率 优秀的听觉体验,文件大小适中
320 kbps 高音质 MP3,接近无损 发烧友或高要求场景
1,411 kbps 无损音频(如 CD 的 WAV 格式) 原始音质,文件较大,无压缩或失真
2,304 kbps 高分辨率音频(如 24-bit/96kHz FLAC) 专业录音和音频存档,细节极其丰富

码率可分为三挡:

  • 低码率(8 kbps - 32 kbps)

    • 适用于语音通话和低延迟的实时语音应用。尽管压缩效果好,音质会受到一定的影响,尤其是对于复杂的音频内容(如有背景噪音、音乐或较宽频率范围的声音)。此时,信息丢失较为明显。
  • 中码率(32 kbps - 64 kbps)

    • 适用于大多数语音应用,音质有显著提升,尤其是在人声清晰度方面。在此范围内,Opus 编码器的效果通常是最好的平衡——文件大小相对较小,但音频质量相对较高。
  • 高码率(64 kbps - 128 kbps)

    • 对于高质量音乐和更复杂的音频内容,较高的比特率是必须的。64 kbps 是一个很好的平衡点,既能保证音质,也不会产生过多的压缩失真。128 kbps 或更高的比特率可以提供接近原始音频的质量,但文件大小也会明显增加。
  • 非常高码率(128 kbps - 510 kbps)

    • 在这个范围内,音质几乎可以保持与原始音频完全相同,尤其适合高质量音乐或高复杂度的音频。比特率达到 128 kbps 或更高时,信息丢失很少,压缩比例较低,但这也意味着文件大小较大。
码率与采样率、位深的关系
  • 码率 是音频压缩后的数据传输速率。
  • 采样率 表示音频采样的频率(如 44.1kHz)。
  • 位深 表示每次采样的精度(如 16 位、24 位)。

三者共同影响音频质量,但码率是对最终音频数据量的度量。

码率与文件大小的关系

码率越高,音频文件的大小越大。文件大小计算公式为:

=bps×÷8文件大小(字节) = 码率(bps) \times 持续时间(秒) \div 8

例如,一个码率16 kbps,时长20毫秒的音频文件大小为:

=16,000×0.02÷8=40字节文件大小 = 16,000 \times 0.02 \div 8 = 40 \, \text{字节}

注意:上面是按照CBR模式计算的大小,如果按照VBR模式,音频文件大小是40字节上下波动。

Opus 编码

Opus是一种现代化的音频编码格式,专为实时通信和高效音频传输设计,由 xiph基金 开发并标准化。Opus 是一种开源、免版税的音频编解码器,具有极高的灵活性和音质表现,广泛应用于 VoIP、视频会议、流媒体等领域。

下面是不同音频编码器对比:

上图中横坐标是码率,纵坐标是音频的采样大小等级划分,蓝色的为免费开源,绿色为免费使用但不开源,红色为收费。

音频信号处理中将音频(Audio)分为两大类:语音(Speech)和音乐(Music)。语音一般由人声带发出,人说话时语音的频率一般在 300 ~ 3400 Hz 之间,频率比较低。而音乐包含各种乐器演奏的声音,频率范围更广,涵盖了人耳能够听到的 20 ~ 20 kHz。由于两类音频频率范围各有特点,因此一般会采用不同的技术来处理。

为了对不同频率的音频应用不同的编码技术,Opus 音频频率带宽做了如下划分和命名:

缩写(全称) 音频带宽 应用采样率
NB (narrowband) 4 kHz 8 kHz
MB (medium-band) 6 kHz 12 kHz
WB (wideband) 8 kHz 16 kHz
SWB (super-wideband) 12 kHz 24 kHz
FB* (fullband) 20 kHz 48 kHz

注意: 根据奈奎斯特采样定理,应用 48 kHz 的采样率,实际上可以处理 24 kHz 以内的音频信号,但是即便如此,Opus 也不会处理超过 20 kHz 的音频,因为超过 20 kHz 的音频人耳已经很难听到了。

Opus 编码器结合了两种不同的音频编码技术:

  • SILK(宽带语音编码技术)

    • 专为语音优化,起源于 Skype 的语音编码技术。
    • 在低比特率下提供高质量的语音表现。
  • CELT(低延迟音频编码技术)

    • 适合音乐和高频音频内容的编码。
    • 在较高比特率下,提供接近无损的音质。

Opus 根据音频内容的类型和网络状况动态切换或混合 SILK 和 CELT 两种技术,确保最佳编码效率和音质。

在 Opus 编码中,帧(Frame) 是编码后音频数据的最小处理单元。Opus 支持多种帧长,从短到长的范围为 2.5 ms 至 60 ms,具体包括以下选项:

  • 2.5 毫秒
  • 5 毫秒
  • 10 毫秒
  • 20 毫秒(默认帧长)
  • 40 毫秒
  • 60 毫秒

Opus 工作在 SILK 模式时,支持 NB、MB、WB 频率带宽的音频,并且帧长在 10ms ~ 60ms 之间。工作在 CELT 模式时,支持 NB、WB、SWB、FB 音频带宽,并且帧长在 2.5ms ~ 20ms 之间。Opus 还可以工作在混合模式(Hybrid),也就是 SILK 和 CELT 同时起作用,这种情况下只支持 SWB 、FB 音频带宽,并且帧长为 10ms 或 20ms。

每个 Opus 帧通常包括:

  1. 帧头(Header)
    • 描述帧的属性,如编码模式、采样率、声道数、帧时长等信息。
  2. 音频数据(Payload)
    • 压缩的音频数据,根据编码模式(SILK、CELT 或混合模式)存储音频内容。

帧时长的选择和影响:

帧时长 适用场景 优点 缺点
2.5 ms 超低延迟场景(如实时通信、游戏语音) 延迟极低,适合高交互性场景 压缩效率较低,适合高比特率
10 ms 低延迟场景(如流媒体、视频会议) 延迟适中,音质与效率平衡较好 延迟比 5 ms 稍高
20 ms 通用场景(默认帧时长) 音质好,延迟与压缩效率均较高 延迟适中
60 ms 高稳定性场景(如音频存储、广播) 压缩效率最高,适合网络抖动环境 延迟较高,不适合实时应用

帧的大小

Opus 帧的大小计算公式如下:

帧大小(字节)=比特率(kbps)×帧长(ms)8×1000\text{帧大小(字节)} = \frac{\text{比特率(kbps)} \times \text{帧长(ms)}}{8 \times 1000}

比如,比特率为32kbps,帧长为20ms的帧大小计算过程如下:

  1. 转换比特率单位:

    32kbps=32×1000=32000bps32 \, \text{kbps} = 32 \times 1000 = 32000 \, \text{bps}

  2. 计算 20 毫秒对应的比特数:

    32000bps×20ms1000=640比特32000 \, \text{bps} \times \frac{20 \, \text{ms}}{1000} = 640 \, \text{比特}

  3. 转换为字节数:

    640比特8=80字节\frac{640 \, \text{比特}}{8} = 80 \, \text{字节}

所以在 32 kbps 的比特率和 20 ms 的帧长下,每帧的大小为 80 字节。若 Opus 使用可变比特率,帧大小可能随内容复杂度变化,上述计算为近似值。若使用固定比特率(CBR),则计算值为 80 字节。

下面是不同码率下,不同帧长的帧大小的列表:

码率 (Hz) 2.5 ms 5 ms 10 ms 20 ms 40 ms 60 ms 80 ms 100 ms 120 ms
8 k 20 40 80 160 320 480 640 800 960
12 k 30 60 120 240 480 720 960 1200 1440
16 k 40 80 160 320 640 960 1280 1600 1920
24 k 60 120 240 480 960 1440 1920 2400 2880
32 k 80 160 320 640 1280 1920 2560 3200 3840
48 k 120 240 480 960 1920 2880 3840 4800 5760

参考资料