打开一个 wav 文件以在文本编辑器和 sndfile 中读取数据

Open a wav file to read data in text editor vs in sndfile

我想用 textPad 读取 8 位 wav 文件的数据,我知道数据位于第 44/46 字节,但我无法读取它。

我有那个代码:

52 49 46 46 F8 37 01 00 57 41 56 45 66 6D 74 20
12 00 00 00 06 00 01 00 40 1F 00 00 40 1F 00 00
01 00 08 00 00 00 66 61 63 74 04 00 00 00 C6 37
01 00 64 61 74 61 C6 37 01 00 D6 D4 56 54 D5 56
56 51 D4 D3 D0 D6 54 57 D4 54 57 51 57 D0 D3 D1

等等

粗体部分是它的数据

问题是当我使用 sf_read_int 在 sndfile 中读取它时,我在缓冲区中得到以下值:

3670016  1572864  -3670016   -1572864   524288   -3670016   -3670016 

等等

我应该如何读取wav文件中的数据?我在 sndfile 中得到的数字和 textPad 中的数据之间的等式或 'relationship' 是什么?

哦,还有一件事,如果我将读数切换为 sf_read_float 而不是 int,我得到的值介于 -0.0001 和 +0.0001 之间...

知道发生了什么,写入和数据处理非常好,但我不明白这些值是怎么回事。

谢谢。

您可以在 .wav 文件中看到一些模式:

  • "RIFF" : 0x52 0x49 0x46 0x46
  • "WAVE" : 0x57 0x41 0x56 0x45
  • "fmt " : 0x66 0x6d 0x74 0x20
  • "data" : 0x64 0x61 0x74 0x61

我们在偏移 50 处看到 64 61 74 61。因此数据仅从偏移量 54 而不是 46 开始。

您可以找到一个 wave specification 来了解您的文件是如何编码的。

多亏了这个规范,我可以告诉你你的文件是用 "8-bit ITU-T G.711 A-law" 编码的。

好的,所以我发现 wav 文件是经过编码的,libsndfile 会在没有任何干预的情况下处理它。这导致了 "unequal" 值。