PCM介绍
作者:罗上文,微信:Loken1,公众号:FFmpeg弦外之音
视频的裸数据是YUV,对应音频的裸数据就是PCM,PCM的全称是Pulse Code Modulation(脉冲编码调制)。这个术语非常地术语,看起来不太容易懂,我个人是把 PCM 理解成声音信息的数字化。
我们可以用 ffmpeg 命令从 juren-10s.mp4 里面解码提取出来 PCM 原始数据,如下:
ffmpeg -i juren-10s.mp4 -c:a copy -vn juren-10s.aac
ffmpeg -i juren-10s.aac -ar 48000 -ac 2 -f s16le juren-10s.pcm

上图中,我是先把音频流从mp4里面提取出来了,然后再把音频流解码成 PCM 原始数据。aac 就是经过编码压缩后的文件,所以它的大小会比 PCM 小很多。
PCM 文件的大小是由 采样格式(sampleFormat)、采样数(sampleNum)决定的。
ffmpeg 命令的参数解释如下:
- -f 参数指定的是输出的采样格式,采样格式是 s16le,全称是 signed 16 bits little endian(有符号16位小端),因此一个采样占2个字节。
- -ac 参数指定的是输出的声道数,声道数是2。这是左右声道,也就是在一个空间时刻内,左边采样一次,右边采样一次。
- -ar 参数指定的是输出的采样率,采样率是 48000,代表每秒采样48000次。音频的采样是比视频的采样高很多的,视频一般是1秒采样24次,一秒只有24帧。
现在我们已经知道了这3个属性,但是我们还需要采样数才能手动计算出来PCM文件的大小的,采样数其实可以根据采样率粗略计算出来。
因为这个音频文件有10秒的时长,每秒采样48000次,也就是每秒会产生48000个样本,然后因为他是左右声道的,所以再乘以2,因此计算的结果如下:
48000 * 10 * 2 = 960000
所以这个 juren-10s.pcm 文件一共大约有 960000 个样本,而每个样本占2个字节,所以它的大小应该是在 1875kb 左右,这跟 Windows 系统上显示出来的 1880kb 是几乎一样的。
如果我们想正常显示一个YUV文件,就必须知道它的宽高是多少,采样格式是 4:4:4,4:2:2,还是其他。这些参数你需要设置到 7yuv 里面,图像才会正常显示出来,如果设置错误,图像显示就会出现错位,花屏等。
也就是说YUV文件本身不存储图像的宽高跟采样格式,如果你忘记了它的宽高就无法正常显示它了。
PCM文件是一样的,如果你忘记了它的采样格式,声道数,采样率,你同样无法正常播放PCM文件。我们可以使用 ffplay 命令来播放 juren-10s.pcm 文件,命令如下:
ffplay -i -ar 48000 -ac 2 -f s16le juren-10s.pcm