【问题标题】:What is actually contained in data chunk in wav file?wav 文件的数据块中实际包含什么?
【发布时间】:2017-09-01 10:37:26
【问题描述】:

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

正是how is the 16 bits divided up?


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


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

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

【问题讨论】:

  • 16 位没有被分割 - 它只是一个 16 位的数字,给出了该实例的音量。

标签: c# file audio wav


【解决方案1】:

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

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

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

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 字节。

【讨论】:

    【解决方案2】:

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

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

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

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

    在伪代码中:

    int mydatapoint  // allocate your integer audio curve data point
    

    步骤 0

    mydatapoint = most-significant-byte
    

    在位深度为 8 时停在这里

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

    第一步

    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
    

    第二步

    // 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 数据的多个字节中

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

    【讨论】:

      猜你喜欢
      • 2014-11-14
      • 1970-01-01
      • 2011-01-04
      • 1970-01-01
      • 2010-11-12
      • 1970-01-01
      • 2013-08-03
      • 2016-06-19
      • 2021-09-07
      相关资源
      最近更新 更多