尝试从混音器读取字节(立体声混合)时,ArrayIndexOutBoundSexception



我正在尝试读取给定调音台的音频字节,在这种情况下,是来自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的流功能执行此作业。

原谅我缺乏代码样本。我正在通过手机写这个答案。

最新更新