在 WAV 文件上处理相位取消会生成没有声音的 WAV 文件

Processing Phase Cancellation on WAV file generates WAV file with no sound

所以我正在生成带有相位消除的 WAV 文件。但是生成的 WAV 文件可以播放但没有声音。使用了多个播放器和设备但没有声音。起初我将 Header 复制到目标文件中。那么,

正在读取 WAV 文件的数据部分并获取音频数据数组

 long arrLength = source.length() - Wav_header_size;

    byte[] arr = new byte[(int) arrLength];

    RandomAccessFile filein;
    filein = new RandomAccessFile(source, "rw");
    filein.seek(Wav_header_size);
    filein.read();
    filein.write(arr,0, arr.length);
    filein.close();

从音频数据中获取通道数组

short[] shortAudioArray = new short[arr.length/2];
    short[] channelLeft = new short[arr.length/4];
    short[] channelRight = new short[arr.length/4];
    ByteBuffer.wrap(arr).order(ByteOrder.LITTLE_ENDIAN).asShortBuffer().get(shortAudioArray);

for(int i=0, j=0; i< shortAudioArray.length;i+=2, ++j){
        if(channelLeft.length>j && channelLeft[j]!=0)
            channelLeft[j] = shortAudioArray[i];
        else
            break;
        if(channelRight.length>j && channelRight[j]!=0)
            channelRight[j] = shortAudioArray[i+1];
        else
            break;
    }

通过取消一个阶段然后合并来处理阶段取消

 for(int i =0;i< data2.length;i++) {
        data2[i] = (short) -data2[i];
    }

    for(int i=0,j=0; j< dstAudio.length;i++,j=j+2) {
        if(data1.length>i && data1[i]!=0)
            dstAudio[j] = data1[i];
        else
            break;
        if(data2.length>i && data2[i]!=0)
            dstAudio[j+1] = data2[i];
        else
            break;
    }

   byte[] bytesLast = new byte[dstAudio.length * 2];
    ByteBuffer.wrap(bytesLast).order(ByteOrder.LITTLE_ENDIAN).asShortBuffer().put(dstAudio);

这样可以生成相同大小的音频 WAV 文件,但没有声音。 如果我在整个过程中无论如何都错了,谁能纠正我吗?

Java 提供 类 来处理 .wav 文件的格式和其他结构方面。我强烈建议使用这些工具,而不是尝试编写自己的 .wav headers 等。

您可以在 the Oracle tutorial on sound 阅读有关这些工具的更多信息。该系列的第六篇(使用文件和格式转换器)有一个关于编写音频文件的小节。

因此,我通过将位一位一位地反转而不生成或转换为更短的数组来处理字节数组,从而解决了这个问题。