Java:混合两个WAV文件而不会引入噪音

我正在尝试将2个WAV文件混合到一个WAV文件中。 文件将始终具有完全相同的持续时间并具有相同的格式(16位,44.1 kHz,带符号,小端,单声道)。 使用AudioSystem.getAudioInputSream使用ByteArrayOutputStream将两个WAV放入字节数组,以确保我只获取PCM数据而没有标头。

在其他一些线程的帮助下,我已经能够成功地组合arrays,但不会在信号中引入大量噪声。 它肯定听起来不像剪辑或失真,但我已经尝试平均每对字节的总和以确保安全,这使得一切都更安静,噪音和所有。

任何见解将不胜感激! 我尝试了两种方法,它们应该做同样的事情,并且似乎产生相同的声音结果。

第一个更简单的方法:

private byte[] mixBuffers(byte[] bufferA, byte[] bufferB) { byte[] array = new byte[bufferA.length]; for (int i=0; i<bufferA.length; i++) { array[i] = (byte) ((bufferA[i] + bufferB[i])); } return array; } 

第二个更具体的方法:

 private byte[] mixBuffers(byte[] bufferA, byte[] bufferB) { byte[] array = new byte[bufferA.length]; for (int i=0; i<bufferA.length; i+=2) { short buf1A = bufferA[i+1]; short buf2A = bufferA[i]; buf1A = (short) ((buf1A & 0xff) << 8); buf2A = (short) (buf2A & 0xff); short buf1B = bufferB[i+1]; short buf2B = bufferB[i]; buf1B = (short) ((buf1B & 0xff) <> 8); } return array; } 

如果它有帮助,这就是我如何将文件放入字节数组:

 { ByteArrayOutputStream baos = new ByteArrayOutputStream(); AudioInputStream ais; ais = AudioSystem.getAudioInputStream(audioFile); int read; byte[] buffer = new byte[1024]; while ((read = ais.read(buffer)) != -1) { baos.write(buffer, 0, read); } baos.flush(); byte[] byteBufferA = baos.toByteArray(); baos = new ByteArrayOutputStream(); ais = AudioSystem.getAudioInputStream(audioFile2); buffer = new byte[1024]; while ((read = ais.read(buffer)) != -1) { baos.write(buffer, 0, read); } baos.flush(); byte[] byteBufferB = baos.toByteArray(); byte[] byteBufferC = mixBuffers(byteBufferA, byteBufferB); } 

这些文件包含16位样本 – 每个样本长度为两个字节。 但是,您的第一种方法尝试独立地混合每个字节。 结果就像通过添加每个数字(不带进位)来添加数字:165 + 248 – > 103。

您的第二种方法是使用按位OR而不是添加。 这就像通过取每个数字的最大值来添加两个数字:165 + 248 – > 268。

尝试使用第二种方法,但替换|+