一、为什么要先学音频基础
在嵌入式音视频开发中,音频不像表面看起来那么简单。
很多初学者在接触录音、播放、编码、推流时,容易直接上手 ALSA、FFmpeg 或厂商 SDK,但如果对音频的基本概念理解不够,后面会频繁遇到这些问题:
- 为什么采样率常见的是 8k、16k、44.1k、48k?
- 为什么位深越高,音质越好,但数据量也越大?
- 为什么原始 PCM 文件这么大?
- 为什么会出现噪声、爆音、卡顿、延迟?
- 为什么同样 10 秒音频,PCM、WAV、AAC 文件大小差别很大?
所以,音频基础知识不是"可学可不学"的理论,而是后续学习:
- ALSA 采集与播放
- WAV 文件格式
- AAC 编码
- 音频推流
- 音视频同步
这些内容的底层前提。
二、声音的本质
声音本质上是一种机械波 ,是物体振动在空气等介质中传播形成的。
它属于一种连续变化的模拟信号。
从工程角度来说,我们平时听到的说话声、音乐声、环境噪声,本质上都是空气压力随时间变化形成的波形。
2.1 声音的三要素
通常我们用三个维度去描述声音:
1)频率(Frequency)
频率表示声波在 1 秒内振动的次数,单位是 Hz(赫兹)。
- 频率越高,音调越高
- 频率越低,音调越低
例如:
- 鼓声通常频率较低
- 女声通常频率比男声高
- 鸟叫声通常频率更高
人耳可听到的频率范围大致为:20Hz ~ 20kHz
低于 20Hz 的叫次声波 ,高于 20kHz 的叫超声波。
2)振幅(Amplitude)
振幅表示波动的强弱,可以简单理解为声音的"大小"。
- 振幅越大,声音听起来越响
- 振幅越小,声音听起来越轻
在数字音频里,振幅最终会被量化成离散的数值。
3)波形(Waveform)
波形决定声音的"音色"。
为什么同样唱一个音符,钢琴和小提琴听起来不同?
因为它们产生的波形不同,谐波成分不同,所以音色不同。
也就是说:
- 频率决定音调
- 振幅决定音量
- 波形决定音色
三、模拟音频与数字音频
现实世界中的声音是模拟信号,它的特点是:
- 时间连续
- 幅值连续
但是计算机、单片机、处理器更擅长处理的是数字信号,也就是:
- 时间离散
- 幅值离散
所以,要想让设备处理声音,就必须把模拟音频转换成数字音频,这个过程就叫做:音频数字化
音频数字化通常分为三个步骤:
- 采样
- 量化
- 编码
这三个步骤也是理解 PCM 的基础。
四、音频数字化过程
4.1 采样(Sampling)
采样就是:每隔固定时间,对模拟信号取一个点。
原本连续的声音波形,通过不断"取样",就变成了一串离散的数据点。
采样率
采样率表示:1 秒钟采集多少个样本点,单位是 Hz。
常见采样率如下:
| 采样率 | 典型场景 |
|---|---|
| 8kHz | 电话语音 |
| 16kHz | 语音识别、对讲 |
| 44.1kHz | CD 音乐 |
| 48kHz | 视频音频、专业音频 |
| 96kHz | 高保真音频 |
为什么采样率要这样选?
这和一个非常重要的理论有关:奈奎斯特采样定理。
奈奎斯特采样定理
如果一个模拟信号的最高频率为 fmax,那么采样率至少要满足:
text
fs >= 2 * fmax
也就是说,采样率必须至少是信号最高频率的两倍,才能尽量还原原始信号。
例如:
- 人耳最高能听到约 20kHz
- 所以理论上采样率至少要大于 40kHz
- CD 最后采用了 44.1kHz
这就是为什么 44.1kHz 会成为经典音频采样率之一。
4.2 量化(Quantization)
采样解决的是"时间离散化",
量化解决的是"幅值离散化"。
因为模拟信号的振幅是连续变化的,而数字系统只能表示有限个数值,所以必须把每个采样点的振幅映射到一个固定范围的整数值。
位深(Bit Depth)
量化精度通常由位深决定。
常见位深:
- 8 bit
- 16 bit
- 24 bit
- 32 bit
不同位深可表示的离散级数:
- 8 bit:2^8 = 256 级
- 16 bit:2^16 = 65536 级
- 24 bit:2^24 = 16777216 级
位深的影响
位深越高:
- 振幅表示越精细
- 量化误差越小
- 动态范围越大
- 音质越好
- 数据量也越大
所以在工程里经常要平衡:
- 音质
- 存储
- 带宽
- 处理开销
4.3 编码(Encoding)
完成采样和量化后,就需要把这些数值按一定规则保存为二进制数据,这一步叫编码。
最基础、最常见的音频编码方式就是:PCM(Pulse Code Modulation,脉冲编码调制)
PCM 不是压缩编码,它本质上就是把音频采样值"原样保存"。
所以 PCM 的特点是:
- 实现简单
- 还原度高
- 数据量大
- 适合做原始音频数据
五、PCM 音频数据详解
PCM 是后续学习 WAV、AAC、ALSA、音频采集播放的核心基础。
5.1 PCM 的三个关键参数
一个 PCM 音频流,通常由下面三个核心参数决定:
- 采样率(Sample Rate)
- 位深(Bit Depth)
- 声道数(Channels)
例如:
text
44100Hz / 16bit / 2channel
表示:
* 每秒采样 44100 次
* 每个样本用 16 位表示
* 双声道
5.2 PCM 数据量怎么算?
这是面试和工程中都非常常见的问题。
例子 1:44.1kHz、16bit、双声道
text
每秒数据量 = 采样率 × 位深 × 声道数
= 44100 × 16 × 2
= 1411200 bit/s
换算成字节:
text
1411200 / 8 = 176400 Byte/s ≈ 172.27 KB/s
也就是说,1 秒钟大约 176KB。
那 1 分钟呢?
text
176400 × 60 = 10584000 Byte ≈ 10.09 MB
这就是为什么原始 PCM 文件很大。
5.3 单声道与双声道
单声道(Mono)
只有一路音频数据。
特点:
- 数据量小
- 适合语音
- 常见于对讲、语音识别、低带宽场景
双声道(Stereo)
左右两个声道:
- Left
- Right
特点:
- 更有空间感
- 更适合音乐和多媒体播放
- 数据量是单声道的 2 倍
5.4 PCM 数据存储顺序
对于双声道 PCM,常见有两种存储方式。
1)交错模式(Interleaved)
text
L R L R L R L R ...
即一个左声道样本、一个右声道样本交替存放。
这是最常见的方式,ALSA 默认也常见这种布局。
2)非交错模式(Non-Interleaved)
text
L L L L ...
R R R R ...
左右声道分别连续存储。
这种方式在一些专业音频处理中也会看到。
5.5 大端与小端
在保存多字节样本时,还会涉及字节序问题。
常见格式:
- s16le:16 位有符号小端
- s16be:16 位有符号大端
- s24le:24 位有符号小端
- s32le:32 位有符号小端
例如 s16le 表示:
- signed:有符号
- 16:16 位
- little endian:小端序
在嵌入式 Linux 和 PC 平台上,最常见的是:S16_LE
六、比特率、码率与数据量
很多初学者容易把"采样率"和"比特率"混淆。
6.1 比特率(Bitrate)
比特率表示:单位时间内传输或存储的数据位数
单位通常是:
- bps
- kbps
对于未压缩 PCM 来说,比特率可以直接由参数计算出来:
text
比特率 = 采样率 × 位深 × 声道数
例如:
text
48000 × 16 × 2 = 1536000 bps = 1536 kbps
6.2 压缩编码中的码率
对于 AAC、MP3 这种有损压缩格式,码率通常是编码器输出的目标值,比如:
- 64 kbps
- 96 kbps
- 128 kbps
- 192 kbps
码率越高:
- 音质通常越好
- 文件越大
- 带宽占用越高
七、常见音频格式之间的关系
很多人会把 PCM、WAV、AAC、MP3 混在一起,其实它们不是同一个层面的概念。
7.1 PCM
PCM 是原始音频数据,本质是采样值本身。
7.2 WAV
WAV 本质上通常是:带文件头的 PCM
也就是说:
- PCM 是裸数据
- WAV = 文件头 + PCM 数据
所以 WAV 更方便播放器识别参数,比如:
- 采样率
- 位深
- 声道数
- 数据长度
7.3 MP3 / AAC
它们属于压缩编码格式。
特点:
- 文件更小
- 更适合存储和网络传输
- 解码复杂度更高
- 不再是"原始采样值"
八、嵌入式音频系统中的完整链路
学完基础概念后,一定要用"系统链路"的方式理解嵌入式音频。
8.1 录音链路
text
声音 -> 麦克风 -> 模拟电信号 -> ADC -> 数字音频数据 -> I2S/PCM总线 -> SoC -> ALSA -> 应用程序
8.2 播放链路
text
应用程序 -> ALSA -> I2S/PCM总线 -> Codec/DAC -> 模拟电信号 -> 功放 -> 扬声器
8.3 关键硬件模块
麦克风(Mic)
把声音转换成模拟电信号。
ADC(模数转换器)
把模拟信号转换成数字信号。
DAC(数模转换器)
把数字信号转换成模拟信号。
Codec
很多芯片会把 ADC、DAC、增益控制、混音等功能集成在一起,这类芯片通常统称音频 Codec。
I2S
I2S 是常见的音频数字接口,用来在 SoC 和 Codec 之间传输音频数据。
九、为什么嵌入式音频开发常见 8k / 16k / 48k
很多初学者看到不同项目参数不一样,会疑惑为什么。其实这和业务场景强相关。
9.1 8kHz
- 电话语音
- 低带宽场景
- 只保证人声基本可懂度
9.2 16kHz
- 语音识别
- 对讲
- 智能语音设备
相比 8kHz,16kHz 的高频保留更多,语音清晰度更高。
9.3 44.1kHz
- 音乐
- CD 标准
9.4 48kHz
- 视频音频
- 广播电视
- 影视与流媒体系统中较常见
所以不是参数越大越好,而是要根据:
- 应用场景
- 带宽
- 存储
- 算力
- 实时性
来综合取舍。
十、音频开发中的常见问题
掌握概念只是第一步,真正做项目时,经常会遇到实际问题。
10.1 噪声
常见原因:
- 模拟电路设计不好
- 电源干扰
- 地线处理不好
- 麦克风前端增益过大
- 采样环境本身就很嘈杂
10.2 爆音
常见原因:
- 播放缓存供不上数据
- 数据突变
- 时钟异常
- 音量切换过快
- 录播开始/停止时处理不当
10.3 卡顿
常见原因:
- CPU 忙不过来
- DMA/缓存配置不合理
- 用户态读写不及时
- 中断处理不及时
10.4 延迟过大
常见原因:
- buffer 设置太大
- 编码处理耗时
- 音频链路过长
- 推流发送阻塞
这些问题后面在 ALSA、AAC、推流开发中都会不断遇到。
十一、学习音频基础时容易混淆的几个点
11.1 采样率不是码率
- 采样率:每秒取多少个样本
- 码率:每秒需要多少比特存储或传输
11.2 WAV 不是编码算法
WAV 更像是一种封装格式,内部很多时候装的是 PCM。
11.3 PCM 不是压缩格式
PCM 是最原始的数字音频表示方式,数据量通常很大。
11.4 声道数会直接影响数据量
双声道的数据量是单声道的两倍。
十二、从音频基础到后续章节的衔接
学完这一章之后,后面建议按这个顺序继续学习:
- PCM 编码与 WAV 文件格式
- ALSA 音频采集与播放流程
- AAC 音频压缩编码
- 音频封装格式(ADTS、FLV、MP4、TS)
- 音频推流与同步
- 音视频同步
这样知识链路会比较完整。
十三、总结
音频的本质,是把现实世界中连续变化的声音,转换成设备能存储、处理、传输的数字数据。
理解音频基础,重点要抓住下面几个关键词:
- 声音三要素:频率、振幅、波形
- 音频数字化:采样、量化、编码
- PCM 三参数:采样率、位深、声道数
- 数据量核心:采样率越高、位深越高、声道越多,数据量越大
- 工程目标:在音质、实时性、存储、带宽、算力之间做平衡
对于嵌入式音视频开发来说,音频基础不是"背概念",而是后续做录音、播放、编码、推流、同步的底层前提。