0

在 JDK8 中,我似乎无法从 SoftSynthesizer 创建的 AudioInputStream 中获取任何有用的数据。

    AudioSynthesizer s = new SoftSynthesizer();

    AudioFormat format = new AudioFormat(44100, 16, 2, true, false);
    AudioInputStream stream = s.openStream(format, null);

    s.getChannels()[0].noteOn(60, 100);

    while (stream.available() >= 0) {
        byte[] b = new byte[2];
        stream.read(b);
        System.out.println(b[0] << 8 | b[1]);
    }

    s.getChannels()[0].noteOff(60);

但是,println() 只显示 0,没有音频数据从 AudioInputStream 中输出。难道我做错了什么?还是从 JDK 8 开始不推荐使用 Gervill?

4

1 回答 1

0

似乎我找到了答案。您必须从 AudioInputStream 中准确读取整数倍的数据帧,否则它将始终返回零。在我的例子中,读取 4 个字节解决了这个问题,因为 AudioFormat 是 16 位(2 个字节),2 个通道,所以它是 4 个字节/帧。

改变

byte[] b = new byte[2]

byte[] b = new byte[4]

事实上,任何 4 的整数倍都可以。4、8、12、16、20 等

于 2017-06-18T14:14:55.560 回答