尝试从混音器(立体声混音)读取字节时出现ArrayIndexOutOfBoundsException

时间:2017-12-03 18:33:08

标签: java javax.sound.sampled

我正在尝试从给定的混音器中读取音频字节,在本例中是来自Windows系统的立体声混音。该项目由两部分组成。一个通过Socket(抛出异常的那个)将AudioFormat和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完美地发送字节。

UPDATE:索引800范围适用于8位AudioFormat,如果我选择16位,则超出范围的异常会说1600

1 个答案:

答案 0 :(得分:0)

由于while(true)部分,您的问题是无限循环。您无限读取line对象是一个数组,这意味着它具有特定的长度。因此,在800次循环之后,您将到达数组的边界,并且没有其他对象可供阅读。这就是你得到那种类型的异常的原因。

此问题的解决方案是检查while循环条件中的数组长度。

当然,您可以使用Java 8的Stream功能执行此任务。

请原谅我缺少代码示例。我正在通过手机写这个答案。