不调用TargetDataLine的自定义实现方法

时间:2014-02-05 23:06:58

标签: java audio audio-processing javax.sound.sampled

我尝试使用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");
}

上面提到的代码永远不会到达“已打开”的语句,或抛出异常。 我尝试将printout插入到AssembledDataLine中实现的每个方法中,但是它们都没有被调用(writeArray除外,它在打开流之前被调用)。

所以在这一点上我认为Clip.open(stream)方法甚至在到达从流中获得输入的点之前就会冻结。

我尝试以相同的方式打开文件并且它有效,所以我认为这与我实例化AudioInputStream的方式有关。

1 个答案:

答案 0 :(得分:0)

答案是,Clip虽然没有直接调用AssembledDataLine的方法,但会询问包装AudioInputStream正在使用哪种格式。我错了。我在创建音频格式时交换了FRAME_RATE和FRAME_SIZE的值。 这意味着音频格式无效,因此剪辑会在分配足够的内存以实际播放输入数据时冻结。