如何用 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
相关推荐
集成显卡1 天前
前端视频播放方案选型:主流 Web 播放器对比 + Vue3 实战
前端·vue·音视频
爱吃番茄鼠骗1 天前
回顾ESP32S3系列---音频开发
音视频
ViiTor_AI1 天前
AI 在线字幕去除工具:一键无损删除视频硬字幕与软字幕
人工智能·音视频
愚公搬代码1 天前
【愚公系列】《AI短视频创作一本通》027-AI 短视频创作的注意事项及未来展望(AI短视频的技术展望)
人工智能·音视频
binderIPC1 天前
macos环境下FFmpeg打包成.so文件
macos·ffmpeg·音视频
binderIPC1 天前
macos的FFmpeg环境搭建
macos·ffmpeg·音视频
ViiTor_AI1 天前
视频字幕怎么去除?5 种方法删除硬编码字幕与软字幕(CapCut 实操)
人工智能·计算机视觉·音视频
西***63471 天前
深耕政务数字化,矩阵会议系统多点落地,解锁政务会商新范式
矩阵·音视频·会议系统
奔跑吧 android1 天前
【车载audio】【audio hal 01】【Android 音频子系统:Audio HAL Server 启动全流程深度解析】
android·音视频·audio·audioflinger·aosp15·车载音频·audiohal