音频里的 PCM(Pulse Code Modulation)= 线性脉冲编码调制,是未经压缩的原始音频裸数据,Linux 音频栈最底层格式,ALSA、PipeWire、ALSA 设备交互全部基于 PCM。
核心定义
模拟声波电压 → 定时采样 → 量化为数字整数 → 原始二进制流
- 无损、无压缩、无封装、无编码压缩
- 所有音乐 / 视频音频解码后,最终都会输出为PCM送给声卡播放
四大关键参数(必懂)
1. 采样率 sample rate
每秒采集多少次声波幅值
- 8000Hz:座机电话
- 44100Hz:CD 标准
- 48000Hz:视频 / 影视 / 设备默认
- 96k/192k:HiFi 高解析
2. 位深 bit depth
单个采样点占用比特,决定动态范围、底噪
- 16bit(S16):民用主流
- 24bit(S24):专业录音、声卡
- 32bit Float:混音器、音频引擎内部运算
3. 数据格式(存储 / 排列)
最常用:
- S16_LE:16 位 有符号 小端(Linux 声卡默认)
- S24_LE / S32_LE:24/32 位
- F32_LE:32 位浮点
4. 声道 channels
- 1:单声道
- 2:立体声(左右)
- 6:5.1 环绕
- 8:7.1 环绕
字节计算
单帧(一次采样所有声道)字节数:
每秒字节数:
PCM 常见类型
LPCM 线性 PCM
音频默认,幅值线性分布,WAV、FLAC 原始数据、HDMI 音频都是 LPCM。
原始声波采样数据 = PCM → LPCM 是 PCM 最常用子集 → WAV/FLAC 是封装格式,里面装的是 LPCM
LPCM(Linear PCM,线性 PCM)
✅消费 / 专业音频唯一在用的 PCM
- 采样值线性均匀量化,音量和数值成正比
- 无压缩、无失真、无编码映射
- CD、声卡、ALSA、HDMI、视频原生音频 全部用 LPCM
- 区别:A/μ-law 是非线性 PCM(电话语音用,压缩动态)
日常口语:音频里 PCM = LPCM
WAV(微软 RIFF WAV)
容器格式(封装)
- 结构:WAV 文件头 + LPCM 裸数据
- 头里保存:采样率 / 位深 / 声道 / 字节对齐等参数
- 特点:
- 内部音频编码:固定 LPCM
- 无损、无压缩、体积大
- 后缀
.wav
FLAC(Free Lossless Audio Codec)
无损压缩编码 + 容器
- 输入:LPCM 原始音频
- 处理:无损压缩算法(类似 zip 压缩音频)
- 播放:FLAC 解码 → 还原出和原文件一模一样的 LPCM → 声卡播放
- 特点:
- 音质 = WAV 完全一致
- 体积比 WAV 小 30%~50%
- 不可逆压缩、无音质损失
关键维度对比表
| 格式 | 编码类型 | 压缩 | 有无文件头 | 音质 | 体积 | 场景 |
|---|---|---|---|---|---|---|
| PCM | 调制标准统称 | 不一定 | 无(裸流) | 原始 | 最大 | 底层裸数据、ALSA 裸流 |
| LPCM | 线性无损编码 | 无压缩 | 无 | 无损原版 | 最大 | 声卡底层、视频原生音轨 |
| WAV | 容器 + LPCM | 无压缩 | 有 | 无损 | 大 | 录音、剪辑、编曲 |
| FLAC | 无损压缩编码 | 无损压缩 | 有 | 无损 (同 WAV) | 中等 | 音乐收藏、HiFi |
区别于压缩音频
MP3/AAC/OPUS:压缩格式,播放时解码 → 转 PCM再输出。
核心从属关系
模拟声音 ↓ 采样量化 LPCM 原始裸数据(纯二进制,无参数) ↓ ├─ 加WAV头封装 → WAV 文件 └─ FLAC无损压缩 → FLAC 文件 MP3/AAC(有损) 解码后 → 也是 LPCM 再播放PCM 与 LPCM 核心区别
PCM(脉冲编码调制)
是一大类音频采样编码标准的统称,不是特指某一种格式。包含多种分支:
- LPCM 线性 PCM(民用 / 专业音频主力)
- A-law PCM(电信固话)
- μ-law PCM(欧美电话)
- 非线性压缩 PCM 等
LPCM(Linear PCM 线性脉冲编码调制)
是PCM 的子集、最常用分支。
核心:音频振幅数值 和 音量 呈严格线性正比,无非线性压缩、无失真。
核心差异
| 对比项 | PCM(广义) | LPCM(线性 PCM) |
|---|---|---|
| 范围 | 通用大类 | PCM 的特定子集 |
| 量化方式 | 可线性、可非线性 | 纯线性均匀量化 |
| 压缩 | 部分类型带非线性压缩 | 完全无压缩、无失真 |
| 应用场景 | 通信、语音、音频全覆盖 | 音乐、声卡、视频、专业音频 |
| 设备底层 | 不通用 | 声卡 / ALSA/HDMI 原生格式 |
音频领域口语潜规则
日常音频开发、Linux 音频、音视频开发中:
口头说的「PCM」= 特指 LPCM
- 裸音频流、ALSA 播放数据、WAV 内部数据、MKV/MP4 无损音轨,全是LPCM
- 只有电信语音场景,才会区分 A-PCM / μ-PCM
关键实战区别
非线性 PCM(A/μ-law)
人为压低大音量、放大小音量(非线性),牺牲音质压缩动态,节省带宽,只用于电话。
LPCM
原汁原味记录声波电压数值,无损、线性、高动态,是所有无损音频的原始基底:
FLAC/MP3/AAC 解码 → 统一输出 LPCM → 声卡播放PCM 裸数据排列(LPCM,最常用)
1)单声道(1ch,16bit 示例)
时间 → [样本1(2B)] [样本2(2B)] [样本3(2B)] ...- 每个样本:2 字节(16bit),依次排列
2)立体声(2ch,16bit 交错,主流)
时间 → [L1(2B)][R1(2B)] [L2(2B)][R2(2B)] [L3(2B)][R3(2B)] ...3)立体声平面格式(planar,FFmpeg 常用)
L 声道:[L1][L2][L3]...(连续一块) R 声道:[R1][R2][R3]...(连续一块)Linux 音频栈里的 PCM
ALSA
/dev/snd/pcmC0D0p:播放 PCM 设备- 应用直接写入 PCM 裸数据即可发声
PulseAudio / PipeWire
上层统一做音量、重采样、声道映射,底层依然流转 PCM。
工具测试
# 播放原始16位小端48k立体声PCM aplay -f S16_LE -r 48000 -c 2 test.pcm # 录制原始PCM arecord -f S16_LE -r 48000 -c 2 record.pcm总结
裸 PCM 和 WAV 区别
- 裸 PCM:只有声音二进制,不知道采样率 / 位深,直接打不开
- WAV:带头部参数,播放器直接识别播放
LPCM 为什么单独存在?
电视 HDMI、MP4/mkv 内音轨、专业广播,都是封装里直接存 LPCM,不用 WAV 外壳
FLAC 和 WAV 可以互相无损互转
ffmpeg互转完全无音质损耗:
# WAV → FLAC 压缩 ffmpeg -i audio.wav audio.flac # FLAC → WAV 还原原始LPCM ffmpeg -i audio.flac audio.wav谁是最终播放格式?
所有音频:MP3/OGG/FLAC/WAV/ 视频音轨→ 全部解码统一转为LPCM→ 送给声卡(ALSA/PipeWire)播放