Warning: file_get_contents(/data/phpspider/zhask/data//catemap/3/arrays/13.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Java 需要此流的帮助(AudioInputStream->byte Array->AudioOutputStream)_Java_Arrays_Audio_Bytearray_Javasound - Fatal编程技术网

Java 需要此流的帮助(AudioInputStream->byte Array->AudioOutputStream)

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

我正在制作一个修改原始声音的程序

我的程序在这里

从AudioInputStream获取声音 将声音数据更改为字节数组。我的AudioFormat的帧大小为4。所以,我将使用长度为4的字节数组 对每个元素修改字节数组,比如乘法-1 将修改后的字节数组发送到AudioOutputStream 播放声音。 我做了过程1、2和3

这是我的流程1、2、3的代码

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);