如何用 FFmpeg 处理 PCM 音频 & 判断 PCM 文件到底是什么格式

文章目录

  • [一、什么是 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 文件时:

  1. 先看文件大小,猜测可能的位深
  2. 用大小推算采样点数
  3. 结合采样率估算时间长度
  4. 用 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
相关推荐
REDcker9 天前
WebCodecs VideoDecoder 的 hardwareAcceleration 使用
前端·音视频·实时音视频·直播·webcodecs·videodecoder
gihigo19989 天前
基于TCP协议实现视频采集与通信
网络协议·tcp/ip·音视频
山河君9 天前
四麦克风声源定位实战:基于 GCC-PHAT + 最小二乘法实现 DOA
算法·音视频·语音识别·信号处理·最小二乘法·tdoa
音视频牛哥9 天前
Android平台RTMP/RTSP超低延迟直播播放器开发详解——基于SmartMediaKit深度实践
android·人工智能·计算机视觉·音视频·rtmp播放器·安卓rtmp播放器·rtmp直播播放器
qq_416276429 天前
通用音频表征的对比学习
学习·音视频
美狐美颜sdk9 天前
Android全局美颜sdk实现方案详解
人工智能·音视频·美颜sdk·视频美颜sdk·美狐美颜sdk
EasyDSS9 天前
私有化部署EasyDSS视频点播能力:全链路视频技术赋能,打造企业级视听新体验
音视频·hls·m3u8·点播技术·智能转码
qq_416276429 天前
DeLoRes——一种通用的音频表征学习新方法(DeLoRes(基于 Barlow Twins 的冗余最小化方法)
学习·音视频
Q_4582838689 天前
从定位到视频:808 + 1078 在各行业的落地实践
音视频
山顶望月川9 天前
实测MiniMax-Hailuo-02:当“开工大吉“变成“无字天书“,国产AI视频模型的能与之不能
人工智能·音视频