.wav文件中的字节代表什么?

时间:2012-10-23 21:48:25

标签: audio wav

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

6 个答案:

答案 0 :(得分:52)

您会听说,音频信号由某种波形表示。如果你曾经看到这个波形图上下一行 - 这基本上就是那些文件中的内容。请查看http://en.wikipedia.org/wiki/Sampling_rate

中的此文件图片

sampling

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

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

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

abcdefgh

此处ab组成第一个16位数字,它是通道1的第一个值,cd将是通道2的第一个数字。 ef是频道1的第二个值,gh是频道2的第二个值。你不会听到那么多,因为那不会很接近到第二个数据...

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

当然,它不是2位值,而是两个2字节值,或者你的质量非常差。

答案 1 :(得分:15)

前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,采用带符号的二进制补码小端格式,代表任意缩放的采样,速率为44100 Hz。

Wave File Format

答案 2 :(得分:6)

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

答案 3 :(得分:5)

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

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

答案 4 :(得分:3)

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

答案 5 :(得分:0)

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

  • 采样:任何信号的采样是指该信号在采样点处的振幅。The sample at t=1.23 is taken where the amplitude is 0.94. Thus the sample value is 0.94
  • 采样率:可以在给定的时间间隔内进行许多此类采样。假设我们在1秒钟内采集了10个正弦波样本。每个样本间隔0.1秒。因此,我们每秒有10个样本,因此采样率为10Hz。标头中的第25至28个字节表示采样率。


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

绘制在http://fooplot.com

上的图