文件格式为“PCM_SIGNED 44100.0 Hz,16位,立体声,4字节/帧,小端”,我想将它们放在一起,同时放大两个文件中的一个。我计划读取两个wav,将它们放入两个audioinputstream实例,然后将实例存储到两个byte []数组中,在数组中操作,并作为另一个audioinputstream实例返回。
我做了很多研究但是没有取得好成绩。 我知道这是来自www.jsresources.org的一个混合两个audioinputstream的类,但它不允许我在混合之前修改两个流中的任何一个,而我想在混合之前减少其中一个流。你觉得我应该怎么做?
答案 0 :(得分:1)
为此,您可以将流转换为PCM数据,将要更改其体积的通道乘以所需因子,将结果中的PCM数据相加,然后转换回字节。
要以每个字节为基础访问AudioStream,请查看Using Files and Format Converters上Java Tutorials部分中的第一个扩展代码片段。这显示了如何获取声音字节数据的数组。有一条评论如下:
// Here, do something useful with the audio data that's
// now in the audioBytes array...
此时,迭代字节,转换为PCM。基于以下内容的一组命令应该有效:
for (int i = 0; i < numBytes; i += 2)
{
pcmA[i/2] = audioBytesA[i] & 0xff ) | ( audioBytesA[i + 1] << 8 );
pcmB[i/2] = audioBytesB[i] & 0xff ) | ( audioBytesB[i + 1] << 8 );
}
在上文中, audioBytesA 和 audioBytesB 是两个输入流(基于示例代码的名称), pcmA 和< strong> pcmB 可以是 int 数组或 short 数组,保存的值适合 short 的范围。最好使 pcm 数组浮动,因为你将做一些会导致分数的数学运算。使用浮动,如下例所示,只增加了一个值得精确的位置(比使用 int 时更好的舍入),而 int 的执行速度更快。我认为如果音频数据规范化以便与其他处理一起使用,通常会使用浮点数。
从那里,改变音量的最佳方法是将每个PCM值乘以相同的量。例如,要将音量增加25%,
pcmA[i] = pcmA[i] * 1.25f;
然后,添加pcmA和pcmB,并转换回字节。您可能还想放入最小或最大功能以确保音量和音量。合并不要超过可以适合16位格式的值。
我使用以下内容转换回字节:
for (int i = 0; i < numBytes; i++)
{
outBuffer[i*2] = (byte) pcmCombined[i];
outBuffer[(i*2) + 1] = (byte)((int)pcmCombined[i] >> 8 );
}
上面假设pcmCombined []是一个float数组。如果转换代码是short []或int []数组,则转换代码可能会更简单。
我在my website发布的程序中剪切并粘贴了上述内容,并根据您的方案对其进行了编辑,因此如果有错误信息或错误信息,请在评论中告诉我们我会修好它。