【问题标题】:What do the bytes in a .wav file represent?.wav 文件中的字节代表什么?
【发布时间】:2012-10-13 22:33:42
【问题描述】:

当我将 .wav 文件中的数据存储到字节数组中时,这些值是什么意思? 我读过它们是两字节表示的,但是这些两字节值中究竟包含什么?

【问题讨论】:

  • 也许不是最技术性的资源,但相当全面,关于 WAV 的Wikipedia article

标签: audio wav


【解决方案1】:

您会听说,音频信号是由某种波表示的。如果你曾经看过这个带有一条上下线的波形图——那基本上就是这些文件里面的内容。看看这张来自http://en.wikipedia.org/wiki/Sampling_rate的文件图片

您会看到音频波(灰线)。该波的当前值被反复测量并以数字形式给出。那就是那些字节中的数字。有两个不同的东西可以用这个来调整:你每秒进行的测量次数(这是采样率,以赫兹为单位——这是你每秒抓取的次数)。另一个调整是你测量的精确度。在 2 字节的情况下,一次测量需要两个字节(通常是从 -32768 到 32767 的值)。因此,有了那里给出的这些数字,您可以重新创建原始波形(当然,质量有限,但在以数字方式存储内容时总是如此)。重现原始波形是您的扬声器在播放时尝试做的事情。

还有一些你需要知道的事情。首先,由于它是两个字节,因此您需要知道字节顺序(大端、小端)才能正确地重新创建数字。其次,你需要知道你有多少个频道,以及它们是如何存储的。通常你会有单声道(一个通道)或立体声(两个),但更多是可能的。如果您有多个频道,您需要知道它们是如何存储的。通常你会让它们交错,这意味着你在每个时间点为每个通道获取一个值,然后为下一个时间点获取所有值。

举例说明:如果你有两个通道的 8 字节数据和 16 位数字:

abcdefgh

这里 ab 将组成第一个 16 位数字,这是通道 1 的第一个值,cd 将是通道 2 的第一个数字。ef 是通道 1 的第二个值,gh 通道 2 的第二个值。在那里你听不到太多,因为那不会接近一秒钟的数据...

如果你把你拥有的所有信息加在一起,你可以计算出你拥有的比特率,即记录器每秒产生多少比特信息。在我们的示例中,您在每个样本上为每个通道生成 2 个字节。如果有两个通道,那就是 4 个字节。您需要每秒大约 44000 个样本来表示人类蜜蜂通常可以听到的声音。所以你最终会得到每秒 176000 字节,也就是每秒 1408000 位。

当然,它不是 2 位的值,而是两个 2 字节的值,否则质量会很差。

【讨论】:

  • 你最终没有提到该图中的垂直轴是什么,或者保存的值的性质
  • 感谢您的回答,但我有一个疑问:如果我有 9745238 帧并且我有 2 通道音频,那么我将同时将数据作为第 1 和第 2 通道而不是在您的示例中交替abcdefgh 然后 a 将属于通道 1 的第一个值,而 b 将属于通道 2 的第一个值,依此类推。不应该这样吗?
  • @PaulNicolashunter 在示例中每个值由 2 个字节(=16 位)组成,因此 ab 只是一个存储为 signed int16 的值。 cd 是通道 2 的第一个值。您的版本对于 8 位音频是正确的(我的示例与我在 de.wikipedia.org/wiki/… 上阅读的德语维基百科文章一致)。
  • 哦,好吧实际上我有这个疑问,因为当我观察在两个 python 模块 wavescipy 下具有 2 通道的音频文件时,wav 返回一个字节字符串,我后来转换为16bit int,但scipy 给我返回了一个9745238 X 2 有符号16bit-int 的矩阵(其中1 列是通道1 数据,2 列是通道2 数据),当我比较它时对于 nparray 的 wav 输出,它是按照我在之前的评论中告诉你的顺序,所以它与你的回答有点矛盾。
  • 但是,是否有任何可靠的方法可以每秒或毫秒找到这些值(连续 1、2 个通道),因为当我将帧速率与音频文件的持续时间相乘时,它必须返回总计帧/样本的数量,但不,它返回了我 9702000 而总共有 9745238 任何猜测为什么会发生这种情况
【解决方案2】:

前 44 个字节通常是标准 RIFF 标头,如下所述: http://tiny.systems/software/soundProgrammer/WavFormatDocs.pdf 在这里:http://www.topherlee.com/software/pcm-tut-wavformat.html

Apple/OSX/macOS/iOS 创建的 .wav 文件可能会在头文件中添加一个“FLLR”填充块,从而将初始头文件 RIFF 的大小从 44 字节增加到 4k 字节(也许是为了更好地对齐磁盘或存储块原始样本数据)。

其余的通常是 16 位线性 PCM,采用有符号 2 的补码 little-endian 格式,表示以 44100 Hz 的速率任意缩放的样本。

【讨论】:

  • 你能告诉如何播放波形字节流,没有任何标题?
  • @hotpaw2:请您过来帮助我或在这里评论我的类似问题吗? stackoverflow.com/questions/58730713/…关于16位44Khz,我需要解释和注释为什么数据区的值与图像曲线不同。
【解决方案3】:

WAVE (.wav) 文件包含一个标头,指示音频文件数据的格式信息。标题之后是实际的音频原始数据。您可以在下面查看它们的确切含义。

Positions  Typical Value Description

1 - 4      "RIFF"        Marks the file as a RIFF multimedia file.
                         Characters are each 1 byte long.

5 - 8      (integer)     The overall file size in bytes (32-bit integer)
                         minus 8 bytes. Typically, you'd fill this in after
                         file creation is complete.

9 - 12     "WAVE"        RIFF file format header. For our purposes, it
                         always equals "WAVE".

13-16      "fmt "        Format sub-chunk marker. Includes trailing null.

17-20      16            Length of the rest of the format sub-chunk below.

21-22      1             Audio format code, a 2 byte (16 bit) integer. 
                         1 = PCM (pulse code modulation).

23-24      2             Number of channels as a 2 byte (16 bit) integer.
                         1 = mono, 2 = stereo, etc.

25-28      44100         Sample rate as a 4 byte (32 bit) integer. Common
                         values are 44100 (CD), 48000 (DAT). Sample rate =
                         number of samples per second, or Hertz.

29-32      176400        (SampleRate * BitsPerSample * Channels) / 8
                         This is the Byte rate.

33-34      4             (BitsPerSample * Channels) / 8
                         1 = 8 bit mono, 2 = 8 bit stereo or 16 bit mono, 4
                         = 16 bit stereo.

35-36      16            Bits per sample. 

37-40      "data"        Data sub-chunk header. Marks the beginning of the
                         raw data section.

41-44      (integer)     The number of bytes of the data section below this
                         point. Also equal to (#ofSamples * #ofChannels *
                         BitsPerSample) / 8

45+                      The raw audio data.            

我从http://www.topherlee.com/software/pcm-tut-wavformat.html这里复制了所有这些

【讨论】:

  • 请正确使用您的条款。您正在混合字节和位。没有 32 字节整数之类的东西 - 它是 32 位的。
【解决方案4】:

正如其他人指出的那样,wav 文件中有元数据,但我认为您的问题可能是,具体来说,字节(数据,而不是元数据)是什么意思?如果这是真的,那么字节代表所记录信号的

这是什么意思?好吧,如果您提取代表每个样本的两个字节(例如)(假设是单声道录音,这意味着只录制了一个声道),那么您将得到一个 16 位的值。在 WAV 中,16 位(总是?)有符号和小端(顺便说一下,AIFF,Mac OS 对 WAV 的回答,是大端)。因此,如果您取该 16 位样本的值并将其除以 2^16(或 2^15,我猜,如果它是签名数据),您最终将得到一个标准化为范围内的样本-1 到 1。对所有样本执行此操作并绘制它们与时间的关系(时间取决于记录中的样本数/秒;例如 44.1KHz 表示 44.1 个样本/毫秒,因此第一个样本值将绘制在 t =0,在 t=1ms 时的第 44 次等),您就会得到一个大致代表最初记录的信号。

【讨论】:

    【解决方案5】:

    我想您的问题是“.wav 文件的数据块中的字节代表什么?”让我们系统地了解一切。
    前奏: 假设我们使用某些设备播放 5KHz 正弦波并将其记录在一个名为“sine.wav”的文件中,并在单通道(单声道)上完成记录。现在您已经知道该文件中的标头代表什么。 让我们来看看一些重要的定义:

    • 样本:任何信号的样本是指该信号在采样点的幅度。
    • 采样率:可以在给定的时间间隔内采集许多此类样本。假设我们在 1 秒内采集 10 个正弦波样本。每个样本间隔 0.1 秒。所以我们每秒有 10 个样本,因此采样率为 10Hz。标头中的第 25 到 28 字节表示采样率。


    现在来回答您的问题:
    实际上不可能将整个正弦波写入文件,因为正弦波上有无限个点。相反,我们固定一个采样率并开始以这些间隔对波进行采样并记录幅度。 (选择采样率使得可以使用我们将要采集的样本以最小的失真来重建信号。由于样本数量不足而导致的重建信号中的失真称为“混叠”。)
    为了避免混叠,采样率选择为正弦波频率的两倍以上(5kHz)(这称为'sampling theorem',两倍频率的速率称为“奈奎斯特率”)。因此,我们决定采用 12kHz 的采样率,这意味着我们将在一秒钟内对正弦波进行 12000 次采样。
    一旦我们开始录制,如果我们录制信号,它是 5kHz 频率的正弦波,我们将有 12000*5 个样本(值)。我们将这 60000 个值放入一个数组中。然后我们创建适当的标头以反映我们的元数据,然后我们将这些样本(我们以十进制记下)转换为它们的十六进制等价物。然后将这些值写入 .wav 文件的数据字节中。

    情节绘制于:http://fooplot.com

    【讨论】:

    【解决方案6】:

    两位音频听起来不太好 :) 最常见的是,它们将样本值表示为 16 位有符号数字,表示以 44.1kHz 等频率采样的音频波形。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2014-06-23
      • 1970-01-01
      • 2019-05-30
      • 1970-01-01
      相关资源
      最近更新 更多