我正在尝试读取给定调音台的音频字节,在这种情况下,是来自Windows系统的立体声混音。该项目由2个部分组成。一个人通过插座(抛出异常的插座)将AudiooFormat和Mixer ID发送到第二个,该插座可以从混音器打开给定的线路,以便它可以读取音频字节并将其发送到第三方软件。
> > 。执行此任务的代码是以下...
try {
line = (TargetDataLine) mixer.getLine(info);
line.open(format);
int bytesRead, CHUNK_SIZE = 4096;
byte[] data = new byte[line.getBufferSize() / 5];
line.start();
while (true) {
bytesRead = line.read(data, 0, CHUNK_SIZE); // Exception thrown in here.
stdout.write(data, 0, bytesRead);
stdout.flush();
}
} catch (LineUnavailableException ex) {
System.out.println("Line is unavailable.");
ex.printStackTrace();
}
和具体错误消息是以下...
Exception in thread "main" java.lang.ArrayIndexOutOfBoundsException: Array index out of range: 800
at com.sun.media.sound.DirectAudioDevice$DirectTDL.read(Unknown Source)
at org.Main.main(Main.java:69)
这个错误使我感到惊讶,因为几个月前测试了完全相同的代码,并且可以完美地通过stdout发送字节。
更新:索引800
范围是8位AudioFormat,如果我选择了16位的范围,则不在范围中的例外情况会说1600
。
您的问题是由于while(true)
部分引起的无限循环。您将无限地读取是一个数组的line
对象,这意味着具有特定的长度。因此,在800循环后,您可以到达数组的边界,并且没有其他对象要读取。这就是为什么您会得到这种异常。
解决此问题的解决方案是检查循环条件内的阵列长度。
当然,您可以使用Java 8的流功能执行此作业。
原谅我缺乏代码样本。我正在通过手机写这个答案。