我试图开始使用 javax.sound.sampled-package。
我尝试实现我自己的 TargetDataLine 版本(此时出于测试目的)。然而,令我非常沮丧的是,当我完成并尝试“播放”它时,它的任何一个方法都没有被调用(也没有引发任何异常),而是程序冻结了。
有问题的代码段如下所示:
try {
// create stream.
AssembledDataLine line = new AssembledDataLine();
AudioInputStream stream = new AudioInputStream(line);
// create content.
int size = 65536;
byte[] array = new byte[size];
byte inc = 1;
byte pos = (byte) 0;
for (int i = 0; i < size; ++i) {
array[i] = (pos += inc);
if (pos == 127) {
inc = -1;
} else if (pos == -128) {
inc = 1;
}
}
line.writeArray(array);
// play.
System.out.println("starting to play.");
Clip clip = AudioSystem.getClip();
clip.loop(Clip.LOOP_CONTINUOUSLY);
System.out.println("got clip");
clip.open(stream);
System.out.println("opened");
clip.start();
Thread.sleep(5000);
System.out.println("started");
clip.close();
System.out.println("end.");
} catch (Exception e) {
e.printStackTrace();
System.out.println("error");
}
上面提到的代码永远不会到达“opened”语句,或者抛出异常。我尝试将打印输出插入到 AssembledDataLine 中实现的每个方法中,但它们都没有被调用(除了 writeArray,它在打开流之前被调用)。
所以在这一点上,我认为 Clip.open(stream) 方法甚至在达到从流中获取输入的点之前就冻结了。
我尝试以相同的方式打开文件并且它有效,所以我认为这与我实例化 AudioInputStream 的方式有关。