文章目录
- [一、什么是 PCM?](#一、什么是 PCM?)
- [二、如何通过 FFmpeg 生成 PCM](#二、如何通过 FFmpeg 生成 PCM)
- [三、拿真实 PCM 文件判断参数](#三、拿真实 PCM 文件判断参数)
- 四、如何进一步确认采样率
- 五、总结
在音频开发和信号处理领域,我们常常会接触到一个看起来 "很神秘" 的文件格式------ PCM(原始音频数据) 。它不像 WAV 或 MP3 那样自带头信息,因此很多人拿到之后都会困惑:
"这个 PCM 究竟是什么采样率?是单声道还是双声道?位深是多少?"
一、什么是 PCM?
PCM(Pulse Code Modulation) 就是未经压缩的原始音频采样数据,它不带头信息,因此文件本身不包含任何格式说明。
常见的 PCM 参数包括:
| 参数 | 含义 |
|---|---|
| 采样率(sample rate) | 每秒采样多少个样本(例如 8000、16000、44100 Hz) |
| 位深(bit depth) | 每个样本点占用多少位(如 8bit、16bit、32bit) |
| 声道(channels) | 单声道(1)或立体声(2) |
例如,
16kHz 16bit 单声道 PCM
就是每秒 16000 个采样点,每个点占 16 位(即 2 字节),单声道,因此每秒数据约为:
16000 × 2 = 32000 bytes
二、如何通过 FFmpeg 生成 PCM
很多时候我们需要把压缩的音频格式(如 MP3)解码成 PCM。
下面是最常用的命令:
把 MP3 转成 PCM(16bit 小端)
bash
ffmpeg -i input.mp3 -f s16le -ar 16000 -ac 1 -acodec pcm_s16le output.pcm
参数说明:
-f s16le-- 指定输出为 PCM 16bit 小端(Little Endian)-ar 16000-- 采样率 16kHz-ac 1-- 单声道pcm_s16le-- 使用 PCM 有符号 16bit 小端编码
生成的 output.pcm 就是纯音频采样数据,没有头信息,可以用于信号处理、识别等场景。
三、拿真实 PCM 文件判断参数
现在进入实战!我们分析一个真实的 PCM 文件。
文件信息:
| 属性 | 数值 |
|---|---|
| 文件名 | send2device.pcm |
| 文件大小 | 20514 bytes |
1)根据大小判断位深
首先计算:
文件大小 20514 bytes
常见位深:
| 位深 | 每样点字节 |
|---|---|
| 8bit | 1 byte |
| 16bit | 2 bytes |
| 32bit | 4 bytes |
尝试除法:
20514 ÷ 2 = 10257 → 整除
说明最可能是 16bit PCM(每采样点 2 字节)。
因为:
20514 ÷ 1 = 20514(也整除)
20514 ÷ 4 = 5128.5(不整除)
但 8bit PCM 很少用于现实人声场景,所以更可能是 16bit。
2)根据可能采样率估算时长
已知采样点数:
总采样点 = 20514 bytes ÷ 2 = 10257
不同采样率对应时长:
| 采样率 | 时长 |
|---|---|
| 8000 | 10257 ÷ 8000 ≈ 1.28 秒 |
| 16000 | 10257 ÷ 16000 ≈ 0.64 秒 |
| 44100 | 10257 ÷ 44100 ≈ 0.23 秒 |
四、如何进一步确认采样率
单从文件大小是 无法确定采样率 的,但可以通过播放或频谱分析,更准确判断:
把 PCM 转成 WAV
给 PCM "加头",才能播放或可视化:
✔ 假设是 8kHz
bash
ffmpeg -f s16le -ar 8000 -ac 1 -i send2device.pcm out_8000.wav
✔ 假设是 16kHz
bash
ffmpeg -f s16le -ar 16000 -ac 1 -i send2device.pcm out_16000.wav
五、总结
当你遇到一个 PCM 文件时:
- 先看文件大小,猜测可能的位深
- 用大小推算采样点数
- 结合采样率估算时间长度
- 用 FFmpeg 生成 WAV 试听+分析
核心公式:
总采样点 = 文件大小 ÷ 每样点字节
音频时长 = 总采样点 ÷ 采样率
实用命令回顾
| 任务 | 命令 |
|---|---|
| MP3 → PCM | ffmpeg -i input.mp3 -f s16le -ar 16000 -ac 1 -acodec pcm_s16le output.pcm |
| PCM → WAV (8kHz) | ffmpeg -f s16le -ar 8000 -ac 1 -i send2device.pcm out_8000.wav |
| PCM → WAV (16kHz) | ffmpeg -f s16le -ar 16000 -ac 1 -i send2device.pcm out_16000.wav |