wav 文件中的数据块实际上包含什么?

问题描述 投票:0回答:2

以立体声通道 wav 文件为例,采样率为 44100,位深度为 16 位。

完全正确

how is the 16 bits divided up?


我使用的音频剪辑,前 4 个字节包含有关第一个音频通道的数据,接下来的 4 位 - 我不知道它是什么(即使替换为 0 ,对最终音频文件没有影响)。


接下来的 4 个字节包含有关第二个音频通道的数据,接下来的 4 位 - 我不知道它是什么(即使替换为 0 ,对最终音频文件没有影响)。

所以我想弄清楚这 4 位是什么。

c# file audio wav
2个回答
2
投票

WAV 文件包含多个块。 FMT块指定音频数据的格式。 实际的音频数据位于数据块内。 这取决于实际的格式。但我们假设以下格式为例:

PCM,16 位,2 通道,采样率为 44100Hz。

音频数据以样本的形式表示。在这种情况下,每个样本占用 16 位 = 2 字节。 如果我们有多个通道(在本例中 2 = 立体声),它将如下所示:

left sample, right sample, left sample, right sample, ...

由于每个样本需要 2 个字节(16 位),我们得到这样的结果:

Byte 1 | Byte 2 | Byte 3 | Byte 4 | Byte 5 | Byte 6 | Byte 7 | Byte 8 | ...
left sample     | right sample    | left sample     | right sample    | ...

每个通道的每一秒音频包含 44100 个样本。 因此,一秒音频总共需要 44100 * ( 16 / 8 ) * 2 字节。


1
投票

WAV 格式音频文件 以 44 字节标头开头,后跟有效负载,即未压缩的原始 PCM 音频数据...在有效负载区域中,当您走过 PCM 数据时,每个样本(音频曲线上的点)将包含数据对于所有通道...标头会告诉您通道数...对于使用位深度 16 的立体声,您将看到给定通道的两个字节(16 位 == 位深度),紧接着是下一个通道的两个字节等等...

对于给定的通道,给定的一组字节(在您的情况下为 2 个字节)将出现在两种可能的布局中,这两种布局由字节顺序的选择决定...第一个字节后跟第二个字节...字节顺序的顺序在这里很重要...标头还告诉您正在使用的字节序...通常 WAV 格式是小字节序

每个通道都会生成自己的音频曲线

在您的代码中,要将 PCM 数据转换为可用的音频曲线数据点,您必须将给定通道的给定样本的所有字节组合成单个值...通常是整数而不是浮点数,标头再次定义了哪个...如果是整数,则可以是有符号或无符号的...小端意味着当您读取文件时,第一个(最左边)字节将成为最低有效字节,随后的每个后续字节将成为下一个最高有效字节

伪代码:

int mydatapoint  // allocate your integer audio curve data point

步骤0

mydatapoint = most-significant-byte

在位深度为 8 时停止

...如果您的位深度大于 8 位,现在将其左移,以便为后续字节(如果有)腾出空间

步骤1

mydatapoint = mydatapoint << 8 // shove data to the left by 8 bits
                               // which effectively jacks up its value
                               // and leaves empty those right most 8 bits

步骤2

// following operation is a bit wise OR operation
mydatapoint = mydatapoint  OR next-most-significant-byte

现在对 PCM 数据的每个后续下一个字节按照从最高有效位到最低有效位(对于小端)的顺序重复执行步骤 1 和 2 ...对于超过 16 的任何位深度都至关重要,因此对于 24 位音频或 32 位音频,您将需要将 3 或 4 字节 PCM 数据组合到单个整数输出音频曲线数据点

我们为什么要做这种位移的废话

从模拟转换为数字时的音频保真度水平取决于您录制音频曲线的准确程度...模拟音频是一条连续曲线,但是要成为数字音频,必须沿曲线采样为离散点...两个因素决定了对模拟曲线进行采样以创建其数字表示形式时的保真度...沿着模拟音频曲线的从左到右的距离由采样率确定,沿着音频曲线的上下距离由位深度确定...更高的采样率可以为您提供每秒更多的样本,更大的位深度可以为您提供更多的垂直点来近似模拟音频曲线的瞬时高度

bit depth  8 == 2^8  ==   256 distinct vertical values to record curve height
bit depth 16 == 2^16 == 65536 distinct vertical values to record curve height

因此,为了更准确地将模拟音频曲线的高度记录为数字,我们希望变得尽可能精细......因此最终的音频曲线尽可能平滑,而不是锯齿状,如果我们只分配 2 位,就会出现锯齿状的情况给我们 2^2,这是 4 个不同的值...当您的音频曲线在绘图上只有 4 个垂直值可供选择时,尝试连接这些点...位移位只是从许多字节构建一个整数值数据...大于 256 的数字无法容纳在一个字节中,因此必须分布在 PCM 数据的多个字节中

https://www.mmsp.ece.mcgill.ca/Documents/AudioFormats/

https://www.mmsp.ece.mcgill.ca/Documents/AudioFormats/WAVE/WAVE.html

© www.soinside.com 2019 - 2024. All rights reserved.