从 44,100 kHz 采样率的位深度为 16 位的立体声 wav 文件开始,您将拥有标准 CD 质量的音频文件...在命令行上发出此命令以在文件上显示此类统计信息
ffprobe Cesária_Évora.wav
典型输出
Duration: 00:00:21.51, bitrate: 1411 kb/s
Stream #0:0: Audio: pcm_s16le ([1][0][0][0] / 0x0001), 44100 Hz, 2 channels, s16, 1411 kb/s
从 wav 问题创建 PCM 文件
ffmpeg -i Cesária_Évora.wav -f s16le -acodec pcm_s16le cesaria.dat
请注意,wav 文件只是一个 44 字节的标头,后跟有效负载,它是 PCM 格式的原始音频曲线……这个 PCM 文件严格来说是 L1 R1 L2 R2 仅此而已……任何帧的概念都是我们如何解析没有专用于实现帧的位(如开始/结束标记)的数据......编写代码来操作 PCM 数据请记住您的位深度以及您的文件是否具有小端或大端字节结构...只要您的文件的位深度为 8 位,那么您可以放心地忽略字节顺序,因为您永远不需要移动字节,但是由于上述文件的位深度为 16 位,这意味着音频曲线的每个点都由单个表示每通道 16 位数字(立体声是两个通道,单声道是一个通道)
当读取这样的文件时,这个 16 位数字存储在两个字节中......如果在读取字节时为小端,最左边的字节(在循环中第一次遇到,当您遍历文件时)是最小的字节,然后是下一个更重要的字节含义
L1 R1 L2 R2
下面我们表示音频曲线上两个 16 位点的立体声表示
Llittle1 Lbig1 Rlittle1 Rbig1 Llittle2 Lbig2 Rlittle2 Rbig2
当我们谈到用于存储这两个点的单个字节时......上面的注释显示了 8 个字节......类似地,如果我们有 24 个字节的位深度,那么对于一个通道上的一个原始音频样本来说,如下所示
Llittle1 Lbigger1 Lbiggest1 Rlittle1 Rbigger1 Rbiggest1
所以从概念上讲,当读取位深度为 16 位的小端文件时,这里是您如何为原始音频曲线上的一个点解析一个通道的 PCM
Llittle1 Lbig1
现在要生成一个值L1
,您在概念上执行此操作
L1 = ( Lbig1 << shift 8 bits to left ) + Llittle1
不确定这是否是您正在寻找的抽象级别,但它是确定数字音频的垫脚石
超级有用的工具Audacity允许您导入 PCM 格式的原始音频文件,就像我们在上面生成的 cesaria.dat ... Audacity -> 文件 -> 导入 -> 原始数据 -> 选择 cesaria.dat ->