Java 需要此流的帮助(AudioInputStream->byte Array->AudioOutputStream)
我正在制作一个修改原始声音的程序 我的程序在这里 从AudioInputStream获取声音 将声音数据更改为字节数组。我的AudioFormat的帧大小为4。所以,我将使用长度为4的字节数组 对每个元素修改字节数组,比如乘法-1 将修改后的字节数组发送到AudioOutputStream 播放声音。 我做了过程1、2和3 这是我的流程1、2、3的代码Java 需要此流的帮助(AudioInputStream->byte Array->AudioOutputStream),java,arrays,audio,bytearray,javasound,Java,Arrays,Audio,Bytearray,Javasound,我正在制作一个修改原始声音的程序 我的程序在这里 从AudioInputStream获取声音 将声音数据更改为字节数组。我的AudioFormat的帧大小为4。所以,我将使用长度为4的字节数组 对每个元素修改字节数组,比如乘法-1 将修改后的字节数组发送到AudioOutputStream 播放声音。 我做了过程1、2和3 这是我的流程1、2、3的代码 try { byte[] packet = new byte[4]; int result; while((result = au
try {
byte[] packet = new byte[4];
int result;
while((result = audioInputStream.read(packet)) != -1)
for(int i = 0;i < 4;i++)
reflectedPacket[i] = (byte)(-1 * packet[i]);
//I think I have to do something to send packet to AudioOutputStream in here
}
catch(IOException ioe) {
System.out.println(ioe.getMessage());
}
然而,我不知道如何做进程4,将修改后的字节数组发送到AudioOutputStream
我看到一个使用ByteArrayInputStream的源代码
然而,读取文件的是源,而不是音频输入:
如何执行进程4和进程5?我认为您没有正确地将音频输入流读入字节数组。尝试将while和嵌套for循环替换为:
int framesize = 4;
byte[] packet = new byte[framesize];
int numBytesRead = audioInputStream.read(packet, 0, framesize);
for(int i = 0; i < numBytesRead; i++)
reflectedPacket[i] = (byte)(-1 * packet[i]);
最后,您需要界面来播放声音:
Clip clip = AudioSystem.getClip();
clip.open(newStream);
您正在查找的“AudioOutputStream”被调用。它可以从AudioSystem获取,并且有一个 但作为警告, 我的AudioFormat的帧大小是4 除非你的音频是8位的,有4个通道,否则我可以保证它不是,否定字节听起来就像失真。这是因为帧中的字节是“压缩的”,例如: big-endian 16-bit stereo PCM frame b[0] b[1] b[2] b[3] 00000000 00000000 00000000 00000000 where: - b[0] = left channel high byte - b[1] = left channel low byte - b[2] = right channel high byte - b[3] = right channel low byte 对于little endian,高字节和低字节是相反的
另请参见:。谢谢您的回答!很抱歉,您能给我更多关于AudioInputStream中字节数组的详细信息吗?我注意到AudioInputStream中的4字节数组表示左通道高字节/左低字节/右高字节/右低字节。我从未见过这样的解释。我想做的是有源噪声抵消。所以我必须对输入soundAudioInputStream进行反相处理。然后写给演讲者。对于有源噪声消除有什么建议吗?AudioInputStream中的字节数组是什么样子的?这确实需要一个冗长的解释。Java声音资源FAQ包含了很多解释这类问题的答案,特别是ANC,这个想法很简单,但它假设您有外部噪音的录音。翻转噪波信号并将其添加到播放中,瞧,噪波似乎消失了。不太确定你在寻求什么建议。在实际系统中,您需要校准噪声的振幅,因为如果用户将音量调大,翻转的噪声将变得可听见。作为一个硬件设备,它可能做得最好。如果你只是想学习,你可以自己校准它。 big-endian 16-bit stereo PCM frame b[0] b[1] b[2] b[3] 00000000 00000000 00000000 00000000 where: - b[0] = left channel high byte - b[1] = left channel low byte - b[2] = right channel high byte - b[3] = right channel low byte
int ch0 = (b[0] << 8) | (b[1] & 0xFF);
int ch1 = (b[2] << 8) | (b[3] & 0xFF);
b[0] = (byte)((ch0 >>> 8) & 0xFF);
b[1] = (byte)( ch0 & 0xFF);
b[2] = (byte)((ch1 >>> 8) & 0xFF);
b[3] = (byte)( ch1 & 0xFF);