我正在开发一个项目,我必须使用C合并两个8位.wav文件,而我仍然不知道如何做到这一点。
我已经阅读了有关wav文件的内容,我想从阅读其中一个文件开始。
我有一件事我不明白:
假设我有一个8位WAV音频文件,并且我能够读取(即使我仍在尝试)44字节后开始的数据,我将在逻辑上得到0到255之间的数字。
我的问题是:
这些数字是什么意思? 如果我得到255或0他们是什么意思? 他们是来自波浪的样本吗?
有人可以解释一下吗?
提前致谢
答案 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之间的值意味着音频样本是无符号八位格式,正如您所说的那样。
合并数据的一种方法是将文件中的数据读入缓冲区,数组a
和b
,并按值对它们求和:c[i] = a[i] + b[i]
。通过这样做,您必须处理以下事项:
这通常使用for
循环来实现。你首先得到块的大小。你的for
循环必须以这样一种方式写入,它既不会读取数组边界,也不会忽略可读取的内容。为防止溢出,您可以:
或
有关读取和写入.wav
格式文件的所有细节,您可以使用一些现有的音频文件库,或编写自己的例程。但是,处理音频文件格式并非易事。以下是.wav
format的参考。
以下是一些值得关注的音频文件API:
希望这可以提供帮助。