03-数字音频基础

3 阅读1分钟

数字音频把连续变化的声音表示为按时间排列的离散样本,采样率、采样格式、声道布局和时间基共同决定这些数据应如何解释。

1. 从声音到数字样本

麦克风把空气振动转换为连续变化的电信号,模数转换器再按照固定时间间隔测量信号幅度,并把测量结果量化为数字。播放过程则相反:数字样本经过数模转换和输出设备重新形成连续信号。

数字音频中最重要的四项基础信息是:

  • 每秒包含多少个采样时刻,即采样率。

  • 每个样本使用什么数值类型,即采样格式。

  • 每个采样时刻包含多少个声道,以及各声道代表什么空间位置。

  • 样本按照什么顺序存储,即打包方式和字节序。

缺少其中任意一项,一段原始字节通常都无法被可靠解释。

2. 采样率与可表示频率

采样率以 Hz 表示,例如 48,000 Hz 表示每个声道每秒产生 48,000 个样本。对于带宽受限且采样前正确滤波的信号,采样率必须大于信号最高频率的两倍,才能避免频谱发生不可逆的混叠。

理想上限可写为:

可表示的最高频率 < 采样率 ÷ 2

48,000 Hz 采样率对应的奈奎斯特频率是 24,000 Hz。真实转换系统需要给模拟滤波器保留过渡带,因此不能把“恰好等于一半”理解为所有频率都能无损保留。

常见采样率的用途不同:

采样率

常见场景

说明

8,000 Hz

窄带语音

语音带宽有限,不适合高保真音乐

16,000 Hz

宽带语音、语音识别

能保留比窄带电话更多的语音高频

22,050 Hz、32,000 Hz

较低带宽的音乐或语音流程

兼顾带宽、存储与可表示频率;是否可用取决于设备和处理链

44,100 Hz

音乐发行

音乐文件和光盘体系常见

48,000 Hz

视频、广播、桌面音视频

音视频制作和设备接口常见

88,200 Hz

与 44,100 Hz 体系相关的部分制作流程

数据量约为 44,100 Hz 的两倍

96,000 Hz

部分录音与制作流程

增加处理余量和数据量,不会恢复源信号中不存在的细节

采样率描述时间密度,不等于音量、位深或码率。把 44,100 Hz 文件上采样到 96,000 Hz,只会计算出更多中间样本,不会创造新的原始高频信息。

3. 量化、位深与采样格式

采样得到的连续幅度必须映射到有限的数值集合,这一步称为量化。整数 PCM 的位深决定可用量化级数:

量化级数 = 2^N

其中 N 是每样本有效位数。16-bit PCM 有 65,536 个量化级别;24-bit PCM 有 16,777,216 个级别。

在理想均匀量化、满幅正弦波等前提下,整数 PCM 的量化信噪比近似为:

SQNR ≈ 6.02 × N + 1.76 dB

因此 16-bit 的理论结果约为 98 dB。这个公式描述理想量化器,不等于整套录音设备的实际动态范围;麦克风底噪、模拟前级、模数转换器和环境噪声都会缩小可用范围。

“位深”在交流中常被用来泛指多个概念,实际需要分开判断:

概念

回答的问题

例子

有效位数

样本值中有多少位承载有效精度

24-bit 有效精度

存储位宽

一个样本在内存或文件中占用多少位

24-bit 打包为 3 字节,或装入 32-bit 单元

采样格式

数值类型、符号和打包方式

有符号整数、IEEE 浮点、交错或平面

字节序

多字节数值内部如何排列

little-endian、big-endian

例如,“24-bit 音频”可能是三个字节打包的有符号整数,也可能是 32-bit 容器中只使用其中 24 个有效位。前者和后者在磁盘占用、原始 PCM 解释及 API 输入要求上都不同;不能只凭“24-bit”推导每样本字节数。

常见 PCM 数值表示包括:

采样格式

表示方式

特点

Unsigned 8-bit

无符号整数

零点通常位于数值中间,现代高质量处理较少使用

Signed 16-bit

有符号整数

兼容性好,语音和普通交付常见

Signed 24-bit packed

24-bit 有符号整数

常见的三字节 PCM 存储表示

Signed 32-bit

有符号整数

可承载更高整数精度,但文件更大

32-bit float

IEEE 浮点数

中间处理余量大,便于滤镜运算,不代表模数转换器拥有无限动态范围

64-bit float

IEEE 双精度浮点数

分析或高精度处理中使用,带宽和内存开销更高

整数 PCM 通常把满幅范围映射到格式允许的最小值和最大值。浮点音频常把常规满幅范围归一化为 -1.01.0;处理中可以暂时出现超出该范围的值,但写入整数格式或送到实际输出端前仍需要缩放或限幅。

浮点音频的 “32-bit” 是 IEEE 754 单精度浮点数的存储宽度,不应与 32-bit 整数 PCM 的有效位数等同。无论是 24-bit 整数装入 32-bit 容器,还是 32-bit float,计算数据量都应使用实际每样本字节数;处理数值时则应使用格式定义的缩放范围。

4. PCM、样本、采样帧与编码帧

PCM 是按照时间记录量化幅度的一类表示方式,不是某一种文件扩展名。

几个相近术语需要分开:

术语

含义

样本 Sample

某个声道在一个采样时刻的幅度值

采样帧 Sample Frame

同一采样时刻所有声道样本的集合

音频缓冲 Audio Buffer

一批连续采样帧及其格式、时间信息

编码帧 Encoded Frame

MP3、AAC、Opus 等编码器按自身规则处理的一组样本

数据包 Packet

容器或传输层承载的一段编码数据及时间戳

双声道音频的一个采样帧包含左、右两个样本。48,000 Hz 双声道音频每秒仍然有 48,000 个采样帧,但包含 96,000 个单声道样本值。

编码帧的边界由具体编码格式决定,不能用 PCM 采样帧数量直接替代。容器数据包又可能承载一个或多个编码帧,因此“frame”必须结合上下文解释。

5. 声道数量与声道布局

声道数量只说明同时存在多少条离散信号,声道布局还说明每条信号对应的空间位置。

布局

常见表示

组成示例

单声道

mono

前置中央或单一信号

立体声

stereo

前左、前右

5.1

5.1

前左、前右、前中、低频、两个环绕声道

7.1

7.1

在 5.1 基础上扩展后方或侧方声道

相同声道数量不保证相同布局。例如四声道可能表示四角环绕,也可能只是四条位置未知的独立信号。开发中应优先保存明确的声道布局;只有声道数而没有布局时,自动下混和重映射可能得到错误结果。

立体声转单声道也不应默认只取左声道。常规做法是使用明确的混音矩阵组合左右声道,并留出增益余量,避免两个高度相关的声道相加后削波。

6. 交错、平面布局与字节序

多声道 PCM 有两种常见内存布局。

交错布局把同一采样时刻的各声道样本连续存放:

L0 R0 L1 R1 L2 R2 ...

平面布局把每个声道放在独立平面:

左声道:L0 L1 L2 ...
右声道:R0 R1 R2 ...

FFmpeg 的采样格式名称通常用后缀 p 表示 planar,例如 s16p;没有 ps16 通常表示交错布局。文件中的原始 PCM 还必须明确字节序:

  • s16le:16-bit 有符号整数,小端序。

  • s16be:16-bit 有符号整数,大端序。

  • s24le:24-bit 有符号整数,按三字节小端序打包。

  • s32le:32-bit 有符号整数,小端序。

  • f32le:32-bit 浮点数,小端序。

小端序只描述一个多字节数值内部的字节排列,不描述声道顺序,也不描述平面或交错布局。

7. PCM 数据量与时长计算

对于没有额外填充的交错 PCM:

每采样帧字节数 = 声道数 × 每样本字节数
每秒字节数 = 采样率 × 每采样帧字节数
PCM 数据字节数 = 采样率 × 声道数 × 每样本字节数 × 时长

例如 44,100 Hz、双声道、16-bit、60 秒 PCM:

每样本字节数 = 16 ÷ 8 = 2
数据字节数 = 44,100 × 2 × 2 × 60
           = 10,584,000 字节
           ≈ 10.09 MiB

对应的未压缩数据率为:

44,100 × 2 × 16 = 1,411,200 bit/s

WAV 等容器还会增加文件头和元数据,因此实际文件通常比纯 PCM 数据略大。MP3、AAC 等压缩编码不能使用这条 PCM 公式直接计算最终大小。

PCM 时长也可以从完整采样帧数计算:

时长(秒) = 采样帧数 ÷ 采样率

如果字节数不是每采样帧字节数的整数倍,数据可能被截断或格式解释错误,不应把残缺字节算作完整音频。

8. 使用 FFmpeg 生成和解释原始 PCM

先生成 2 秒、48,000 Hz、双声道、16-bit 小端 PCM:

ffmpeg -f lavfi \
  -i "sine=frequency=1000:sample_rate=48000:duration=2" \
  -ac 2 -c:a pcm_s16le -f s16le tone.raw

这条命令使用 lavfi 的正弦波源,不读取已有媒体文件:

  • sample_rate=48000 让信号源产生 48,000 Hz PCM。

  • -ac 2 把输出设置为双声道。

  • -c:a pcm_s16le 选择 16-bit 有符号小端 PCM 编码表示。

  • -f s16le 输出无文件头的原始 PCM 字节。

原始 PCM 不保存采样率、声道数和采样格式,读取时必须重新提供完全一致的参数:

ffmpeg -f s16le -ar 48000 -ac 2 \
  -i tone.raw \
  -c:a pcm_s16le tone.wav

这里 -f s16le-ar 48000-ac 2 都是输入解释参数。FFmpeg 按这些信息把字节还原成采样帧,再写入带格式头的 WAV。任何参数写错都可能导致速度、音高、声道或幅度异常,但 FFmpeg 未必能从原始字节中自动发现错误。

可以检查生成后的 WAV:

ffprobe -v error \
  -select_streams a:0 \
  -show_entries stream=codec_name,sample_fmt,sample_rate,channels,channel_layout,duration \
  -of default=noprint_wrappers=1 \
  tone.wav

该命令只探测第一条音频流,不重新编码。输出用于确认 PCM 编码名称、采样格式、采样率、声道布局和容器记录的时长。

9. 重采样和格式转换处于什么位置

当输入设备、处理链和输出编码器要求不同格式时,需要转换:

  • 改变采样率需要重采样,并用低通滤波控制混叠。

  • 改变声道布局需要重映射或混音矩阵。

  • 改变整数位深或浮点/整数表示需要采样格式转换。

  • 从较高精度降低到较低整数位深时,可以使用抖动降低量化误差与信号的相关性。

这些转换改变的是 PCM 表示,不等于容器转换或压缩编码。FFmpeg 的 libswresample 能组合完成重采样、声道重矩阵、采样格式和打包布局转换;具体处理方法在《音频信号分析与处理》中继续展开。

10. 常见误区

  • “PCM 就是 WAV”:PCM 是样本表示,WAV 是能承载 PCM 或其他编码的容器。

  • “采样率越高,已有文件的声音一定越好”:上采样不能恢复原始采集阶段没有记录的信息。

  • “24-bit 文件一定有 24-bit 的有效信号”:文件位深不等于模数转换器、处理链或源素材的有效精度。

  • “32-bit float 永远不会削波”:浮点处理中可暂时超过常规满幅,但输出到定点格式、编码器或设备时仍可能削波。

  • “双声道就是两个独立音频文件”:双声道通常是同一时间轴上的两个声道,每个采样帧同时包含左右样本。

  • “声道数量足以描述音频”:多声道处理还需要声道位置和顺序。

  • “原始 PCM 能自动识别参数”:没有文件头时,格式信息必须由外部明确提供。

  • “音频帧只有一种含义”:采样帧、缓冲帧、编码帧和容器数据包是不同层级。

11. 相关链接