关于wav数据子块

时间:2016-07-04 11:38:45

标签: c audio wav

我正在开发一个项目,我必须使用C合并两个8位.wav文件,而我仍然不知道如何做到这一点。

我已经阅读了有关wav文件的内容,我想从阅读其中一个文件开始。

我有一件事我不明白:

假设我有一个8位WAV音频文件,并且我能够读取(即使我仍在尝试)44字节后开始的数据,我将在逻辑上得到0到25​​5之间的数字。

我的问题是:

这些数字是什么意思? 如果我得到255或0他们是什么意思? 他们是来自波浪的样本吗?

有人可以解释一下吗?

提前致谢

2 个答案:

答案 0 :(得分:0)

有关数据块中样本格式的信息,请参阅WAVE的任何优秀指南,例如我发现的这个:http://www.neurophys.wisc.edu/auditory/riff-format.txt

相关摘录:

  

在单通道WAVE文件中,连续存储样本。对于   立体声WAVE文件,通道0代表左声道和声道   1表示正确的频道。扬声器位置映射更多   目前尚未定义两个渠道。在多通道WAVE中   文件,样本是交错的。

  

样本的数据格式

     

每个样品包含在整数i中。我的大小是   包含指定样本所需的最小字节数   尺寸。首先存储最低有效字节。那个位   表示样本幅度存储在最高有效位中   i,其余位设置为零。

     

例如,如果样本大小(以nBitsPerSample记录)为12   比特,然后每个样本存储在一个双字节整数。至少   第一个(最低有效)字节的有效四位设置为   零。

     

PCM波形的数据格式以及最大值和最小值   各种尺寸的样品如下:

Sample Size  Data Format Maximum Value  Minimum Value

One to       Unsigned    255 (0xFF)     0
eight bits   integer

Nine or      Signed      Largest        Most negative more bits   
integer i    positive    value of i
             value of i

N.B。:即使文件具有> 8位的音频分辨率,您也应该将该文件作为unsigned char的数组读取,并按照上述规范手动重新构建较大的样本。 不要尝试做任何事情,例如直接在原生C int数组上读取样本,因为它们的布局和大小取决于平台,因此不应依赖于任何代码。

另请注意,标头保证长度为44个字节:How can I detect whether a WAV file has a 44 or 46-byte header?您需要读取长度并根据该标头处理标头,而不是任何假设。

答案 1 :(得分:0)

假设我们没有处理文件格式问题,获取0到255之间的值意味着音频样本是无符号八位格式,正如您所说的那样。
合并数据的一种方法是将文件中的数据读入缓冲区,数组ab,并按值对它们求和:c[i] = a[i] + b[i]。通过这样做,您必须处理以下事项:

  • 文件的长度可能不相等
  • 总结无符号的8位缓冲区,比如你的几乎肯定会溢出

这通常使用for循环来实现。你首先得到块的大小。你的for循环必须以这样一种方式写入,它既不会读取数组边界,也不会忽略可读取的内容。为防止溢出,您可以:

  • 在阅读时将值除以2

  • 读取(转换)为不会溢出的格式,然后将合并后的数据标准化并转换回原始格式或所需的格式。

有关读取和写入.wav格式文件的所有细节,您可以使用一些现有的音频文件库,或编写自己的例程。但是,处理音频文件格式并非易事。以下是.wav format的参考。

以下是一些值得关注的音频文件API:

libsndfile
sndlib

希望这可以提供帮助。