对WAV文件的处理阶段取消生成没有声音的WAV文件



所以我正在生成具有相位取消的WAV文件。但生成的WAV文件播放,但没有声音。使用多个播放器和设备,但没有声音。首先,我将头文件复制到目标文件。然后,

读取WAV文件的Data部分并获取Audio Data Array

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头文件之类的。

你可以在Oracle的声音教程中阅读更多关于这些工具的信息。本系列的第六篇(使用文件和格式转换器)有一个关于编写音频文件的小节。

所以我通过逐个反转比特来操纵字节数组来解决这个问题,而不产生或转换为更多的短数组。

相关内容

最新更新