PCM 全称 " Pulse Code Modulation " , 脉冲编码调制 , 该 音频数据 是未经压缩的 采样裸数据 , 只有 知道该数据的 采样率 / 采样位数 / 通道数 才能将该音频数据播放出来 ;
PCM 数据是 最原始的音频数据 , 音频内容完全无损 , 但是 PCM 数据体积庞大 , 对 PCM 音频数据压缩 分为 无损压缩 和 有损压缩 :
将 PCM 数据 单纯的添加一个 文件头 , 注明该文件的 采样率 / 采样数 / 通道数 等核心数据 , 就是 WAV 文件 , 该格式的文件体积很大 ;
在 提取 PCM 音频格式常用参数 时 , 需要设置 PCM 数据的 采样率 , 通道数 , 采样位数 ;
-ar
参数 , 设置采样率 ; 取值 48000 或 44100 ;-ac
参数 , 设置 PCM 通道数 ; 取值 1 单声道 , 2 立体声 ;-f
参数 , 可取值如下 : -sample_fmt
参数 , 可取值如下 : -codec:a
参数 , 可取值如下 : 执行
ffmpeg -i input.mp4 -ar 48000 -ac 2 -f s16le output.pcm
命令 , 从 input.mp4 输入文件中 提取 PCM 音频数据 到 output.pcm 输出文件 ;
-ar 48000
参数 设置 输出文件的采样率是 48000 Hz ;-ac 2
参数 设置 输出文件 是 双通道 立体声 ;-f s16le
参数 设置 输出文件 是 16 位小端模式 的 采样 ;执行
ffplay -ar 48000 -ac 2 -f s16le output.pcm
命令 , 播放上述 output.pcm 音频数据 ;
PCM 数据是 纯 音频裸数据 , 没有该音频的 格式信息 , 需要在命令行中额外指定 采样率 , 采样位数 , 通道数 , 如果 指定错了参数 , 播放出来的就是随机噪音 ;
执行
ffmpeg -i input.mp4 -ar 48000 -ac 2 -sample_fmt s16 output.wav
命令 , 从 input.mp4 输入文件中 提取 PCM 音频数据 到 output.pcm 输出文件 ;
-ar 48000
参数 设置 输出文件的采样率是 48000 Hz ;-ac 2
参数 设置 输出文件 是 双通道 立体声 ;-sample_fmt s16
参数 设置 输出文件 是 有符号 16 位 的 采样 ;使用 -sample_fmt
参数设置 采样位数 , 与 -f
参数设置 , 参数取值不同 ;
同时 , 使用 -sample_fmt
参数设置 采样位数 的 输出文件 不能是 PCM 裸数据 , 而是 WAV 封装格式的文件 , WAV 格式的文件就是 PCM 裸数据的基础上 增加了一个文件头 , 用于表明该文件的 采样率 / 采样位数 / 通道数 等音频信息 ;
执行
ffplay output.wav
命令 , 播放上述 提取的 output.wav 音频数据 ;
WAV 格式的文件可以直接使用 ffplay 播放 , 不需要设置 采样率 / 采样位数 / 通道数 等 额外参数 ;
将上述提取的 WAV 文件 与 PCM 文件进行对比 , 发现 WAV 文件 只比 PCM 文件多一个文件头 , 其它数据内容基本一致 ;
执行
ffmpeg -i input.mp4 -ar 48000 -ac 2 -codec:a pcm_s16le output.wav
命令 , 从 input.mp4 输入文件中 提取 PCM 音频数据 到 output.pcm 输出文件 ;
-ar 48000
参数 设置 输出文件的采样率是 48000 Hz ;-ac 2
参数 设置 输出文件 是 双通道 立体声 ;-codec:a pcm_s16le
参数 设置 输出文件 是 16 位 小端模式 的 采样 ;由于 WAV 文件自带文件头 , 上述输出文件 , 也可以通过执行
ffplay output.wav
命令 , 进行播放 , 不需要设置 PCM 的播放参数 ;
上面播放 PCM 格式的音频文件 , 涉及到了设置 PCM 采样位数 , 可以通过如下的命令进行查询 ;
执行
ffmpeg -muxers | findstr PCM
命令 , 可以获取 PCM 的 复用器 ;
-muxers
参数 作用是 尝试列出 ffmpeg 支持的所有复用器 ;|
的作用是 用作管道符号 , 将一个命令的输出 作为 另一个命令的输入 ;findstr PCM
的作用是 用于在文本中搜索字符串 " PCM " , findstr 是 Windows 命令提示符中的一个命令 其作用是 查找字符串 ;可以在命令行中得到如下结果 , 这是 PCM 音频格式的采样位数 可设置的值 ;
D:\004_Operate\ffmpeg>ffmpeg -muxers | findstr PCM
...
E alaw PCM A-law
E f32be PCM 32-bit floating-point big-endian
E f32le PCM 32-bit floating-point little-endian
E f64be PCM 64-bit floating-point big-endian
E f64le PCM 64-bit floating-point little-endian
E mulaw PCM mu-law
E s16be PCM signed 16-bit big-endian
E s16le PCM signed 16-bit little-endian
E s24be PCM signed 24-bit big-endian
E s24le PCM signed 24-bit little-endian
E s32be PCM signed 32-bit big-endian
E s32le PCM signed 32-bit little-endian
E s8 PCM signed 8-bit
E u16be PCM unsigned 16-bit big-endian
E u16le PCM unsigned 16-bit little-endian
E u24be PCM unsigned 24-bit big-endian
E u24le PCM unsigned 24-bit little-endian
E u32be PCM unsigned 32-bit big-endian
E u32le PCM unsigned 32-bit little-endian
E u8 PCM unsigned 8-bit
E vidc PCM Archimedes VIDC
D:\004_Operate\ffmpeg>
执行
ffmpeg -sample_fmts
命令 , 可以查询 -sample_fmts
参数可以设置的值 ;
D:\004_Operate\ffmpeg>ffmpeg -sample_fmts
ffmpeg version n4.4-19-g8d172d9409 Copyright (c) 2000-2021 the FFmpeg developers
built with gcc 10-win32 (GCC) 20210408
name depth
u8 8
s16 16
s32 32
flt 32
dbl 64
u8p 8
s16p 16
s32p 32
fltp 32
dblp 64
s64 64
s64p 64