46

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

4

6 回答 6

70

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

采样

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

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

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

abcdefgh

在这里a,andb将组成第一个 16 位数字,它是通道 1 的第一个值,cd是通道 2 的第一个数字。e并且f是通道 1 的第二个值,g以及h通道 2 的第二个值。你不会听到太多在那里,因为那不会接近一秒钟的数据......

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

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

于 2012-10-24T16:41:52.013 回答
19

前 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 字节(可能是为了更好地对齐原始文件的磁盘或存储块)样本数据)。

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

波形文件格式

于 2012-10-24T22:54:38.283 回答
14

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复制了所有这些

于 2012-10-24T00:31:05.633 回答
8

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

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

于 2013-11-14T03:57:14.570 回答
5

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

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


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

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

于 2019-06-10T19:38:02.267 回答
3

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

于 2012-10-23T21:52:07.090 回答