Skip to content

LV010-PCM简介

一、PCM 简介

PCM 全称 Pulse-Code Modulation,翻译一下是脉冲调制编码。是数字通信的编码方式之一,是一种将模拟信号数字化的方法。主要过程是将话音等模拟信号每隔一定时间进行取样,使其离散化,同时将抽样值按分层单位四舍五入取整量化,同时将抽样值按一组二进制码来表示抽样脉冲的幅值。

简单来说,将前面音频数据进行采样,量化,编码后的二进制数据存储起来就是 PCM 数据,是未经任何处理的原始的音频数据。PCM录音就是将声音等模拟信号变成符号化的脉冲列,再予以记录。

在计算机应用中,PCM 是能达到音频最高保真水平的格式,它被广泛用于素材保存及音乐欣赏,PCM 也因此被称为 无损编码格式。但这并不意味着 PCM 就能够确保信号绝对保真,它只能做到最大程度的无限接近原始声音。

PCM 数据最大的优点就是音质好,最大的缺点就是体积特别大,这是因为它存储的是最原始的音频数据。而且播放器是无法直接播放 PCM 裸数据的,但是我们可以用 cool edit pro软件来分析 PCM 数据,也可以直接播放。

二、PCM 数据常用量化指标

采样率(Sample rate):每秒钟采样多少次,以 Hz 为单位。

位深度(Bit-depth):表示用多少个二进制位来描述采样数据,一般为 16bit。

字节序:表示音频 PCM 数据存储的字节序是大端存储(big-endian)还是小端存储(little-endian),为了数据处理效率的高效,通常为小端存储。

声道数(channel number):当前 PCM 文件中包含的声道数,是单声道(mono)、双声道(stereo)等。

采样数据是否有符号(Sign):要表达的就是字面上的意思,需要注意的是,使用有符号的采样数据不能用无符号的方式播放。

三、存储格式

这个存储格式主要是针对有多个声道的数据,对于音频不同声道的数据,有两种不同的存储格式:

  • 交错格式:不同声道的数据交错排列。
  • 平坦格式:相同声道的数据聚集排列。

image-20251219115148802

下面我们以交错格式为例,看一下对于不同采样位数的存储实例,PCM 的存储方式为一般小端模式(低位字节存储在低地址的位置):

image-20251219115955058

四、PCM 相关参数计算

1. 固定音频时长

16kHz 采样率,音频时长为一帧 40ms,采样位数为 16bit,声道数为 1:

参数 计算公式 示例
1 帧播放时长 固定 40ms 40ms
1 秒的帧数 1 秒 / 1 秒帧数 1 / 40ms = 1 / 0.04 = 25 帧
1 帧的采样点数 采样率 / 1 秒帧数 16000Hz / 25 = 640 个
1 帧占用的字节数 采样点数 x 采样位数 / 8 640 x 16 / 8 = 1280 字节
比特率 采样率(Hz) x 采样位数(bit) x 声道数 16000 x 16 x 1 = 256000 bps = 256kbps
1s 的 PCM 数据大小 1 帧占用字节数 x 1 秒帧数 1280 x 25 = 32000 字节
比特率 / 8 256000 / 8 = 32000 字节

2. 固定采样点数

16kHz 采样率,1 帧采样点数为 640,采样位数为 16bit,声道数为 1:

参数 计算公式 示例
1 帧播放时长 采样点数 (单位: 个) / 采样频率 (单位: 赫兹 Hz) 640 / 16000 = 0.04s = 40ms
1 秒的帧数 1 秒 / 1 秒帧数 1 / 40ms = 1 / 0.04 = 25 帧
1 帧的采样点数 固定 640 个 640 个
1 帧占用的字节数 采样点数 x 采样位数 / 8 640 x 16 / 8 = 1280 字节
比特率 采样率(Hz) x 采样位数(bit) x 声道数 16000 x 16 x 1 = 256000 bps = 256kbps
1s 的 PCM 数据大小 1 帧占用字节数 x 1 秒帧数 1280 x 25 = 32000 字节
比特率 / 8 256000 / 8 = 32000 字节

五、怎么播放 pcm 数据

1. PCM 测试数据

这里可以找一些测试文件,例如:e9372/pcm 测试文件.rar · 开源工具包/语音 PCM 测试文件专用 - AtomGit | GitCode,网上还是有很多的。这里可以拿到这些文件:

image-20251219151542553

但是这个仓库中并没有说明这些原始的 PCM 数据相关参数,不过经过测试,会发现这些其实是 16k 采样率、单声道的 pcm ,采用的是小端模式存储的。其中 3.pcm 是歌曲《凉凉》,可以用这个测,哈哈。

这个也可以:16k_16bit_s16le_mono.zip

2. Cool Edit

Cool Edit Pro 是由 Adobe Systems 公司研发的一款功能十分强大的多轨录音与音频处理软件。人们把 Cool Edit 非常形象地形容为音频“绘画”程序,这是因为该软件在对音频进行处理时就像画画一样,更加形象便于用户理解。可“绘制”的部分包括了制音调、歌曲截断、声音、弦乐、颤音、噪音或是调整静音等。

这个软件是收费的,利用它我们可以对 pcm 数据进行分析和处理,很好用。

3. ffplay

我们还可以用 ffmpeg 工具中的 ffplay,一般安装 ffmpeg 的时候都会一起安装,我们可以通过下面的命令播放 pcm 数据:

shell
ffplay -ar 16000 -f s16le -i ./3.pcm

# -ar 表示采样率
# -f 表示 pcm 格式,sample_fmts + le(小端)或者 be(大端) sample_fmts 可以通过 ffplay -sample_fmts 来查询
# -i 表示输入文件,这里就是 pcm 文件

【例】

shell
D:\sumu_blog\pcm测试文件> ffplay -ar 16000  -f s16le -i .\3.pcm
ffplay version N-122073-g7b773aba82-20251209 Copyright (c) 2003-2025 the FFmpeg developers
  built with gcc 15.2.0 (crosstool-NG 1.28.0.1_403899e)
  configuration: --prefix=/ffbuild/prefix --pkg-config-flags=--static --pkg-config=pkg-config --cross-prefix=x86_64-w64-mingw32- --arch=x86_64 --target-os=mingw32 --enable-gpl --enable-version3 --disable-debug --disable-w32threads --enable-pthreads --enable-iconv --enable-zlib --enable-libxml2 --enable-libvmaf --enable-fontconfig --enable-libharfbuzz --enable-libfreetype --enable-libfribidi --enable-vulkan --enable-libshaderc --enable-libvorbis --disable-libxcb --disable-xlib --disable-libpulse --enable-opencl --enable-gmp --enable-lzma --enable-amf --enable-libaom --enable-libaribb24 --enable-avisynth --enable-chromaprint --enable-libdav1d --enable-libdavs2 --enable-libdvdread --enable-libdvdnav --disable-libfdk-aac --enable-ffnvcodec --enable-cuda-llvm --enable-frei0r --enable-libgme --enable-libkvazaar --enable-libaribcaption --enable-libass --enable-libbluray --enable-libjxl --enable-libmp3lame --enable-libopus --enable-libplacebo --enable-librist --enable-libssh --enable-libtheora --enable-libvpx --enable-libwebp --enable-libzmq --enable-lv2 --enable-libvpl --enable-openal --enable-liboapv --enable-libopencore-amrnb --enable-libopencore-amrwb --enable-libopenh264 --enable-libopenjpeg --enable-libopenmpt --enable-librav1e --enable-librubberband --enable-schannel --enable-sdl2 --enable-libsnappy --enable-libsoxr --enable-libsrt --enable-libsvtav1 --enable-libtwolame --enable-libuavs3d --disable-libdrm --enable-vaapi --enable-libvidstab --enable-libvvenc --enable-whisper --enable-libx264 --enable-libx265 --enable-libxavs2 --enable-libxvid --enable-libzimg --enable-libzvbi --extra-cflags=-DLIBTWOLAME_STATIC --extra-cxxflags= --extra-libs=-lgomp --extra-ldflags=-pthread --extra-ldexeflags= --cc=x86_64-w64-mingw32-gcc --cxx=x86_64-w64-mingw32-g++ --ar=x86_64-w64-mingw32-gcc-ar --ranlib=x86_64-w64-mingw32-gcc-ranlib --nm=x86_64-w64-mingw32-gcc-nm --extra-version=20251209
  libavutil      60. 20.100 / 60. 20.100
  libavcodec     62. 22.101 / 62. 22.101
  libavformat    62.  6.103 / 62.  6.103
  libavdevice    62.  2.100 / 62.  2.100
  libavfilter    11. 10.101 / 11. 10.101
  libswscale      9.  3.100 /  9.  3.100
  libswresample   6.  2.100 /  6.  2.100
[s16le @ 0000025c6a574100] Estimating duration from bitrate, this may be inaccurate
Input #0, s16le, from '.\3.pcm':
  Duration: 00:05:33.33, bitrate: 255 kb/s
  Stream #0:0: Audio: pcm_s16le, 16000 Hz, mono, s16, 256 kb/s
 181.89 M-A:  0.000 fd=   0 aq=   50KB vq=    0KB sq=    0B

然后会打开一个窗口:

image-20251219152649044

这个时候音频就开始播放了。