Проблемы с игрой в WAV на Java - PullRequest
6 голосов
/ 23 февраля 2009

Я пытаюсь сыграть

PCM_UNSIGNED 11025.0 Hz, 8 bit, mono, 1 bytes/frame

файл, как описано здесь (1) и здесь (2) .

Первый подход работает, но я не хочу зависеть от sun.*. Второе приводит к воспроизведению только нескольких ведущих кадров, что больше похоже на щелчок. Не может быть проблема ввода-вывода, так как я играю из ByteArrayInputStream.

Пожалуйста, поделитесь своими идеями о том, почему это может произойти. ТИА.

1 Ответ

25 голосов
/ 23 февраля 2009

Я не уверен, почему второй подход, с которым вы связаны, запускает другой поток; Я верю, что аудио все равно будет воспроизводиться в своем собственном потоке. Проблема в том, что ваше приложение завершает работу до завершения воспроизведения клипа?

import javax.sound.sampled.*;
import java.io.File;
import java.io.IOException;
import javax.sound.sampled.LineEvent.Type;

private static void playClip(File clipFile) throws IOException, 
  UnsupportedAudioFileException, LineUnavailableException, InterruptedException {
  class AudioListener implements LineListener {
    private boolean done = false;
    @Override public synchronized void update(LineEvent event) {
      Type eventType = event.getType();
      if (eventType == Type.STOP || eventType == Type.CLOSE) {
        done = true;
        notifyAll();
      }
    }
    public synchronized void waitUntilDone() throws InterruptedException {
      while (!done) { wait(); }
    }
  }
  AudioListener listener = new AudioListener();
  AudioInputStream audioInputStream = AudioSystem.getAudioInputStream(clipFile);
  try {
    Clip clip = AudioSystem.getClip();
    clip.addLineListener(listener);
    clip.open(audioInputStream);
    try {
      clip.start();
      listener.waitUntilDone();
    } finally {
      clip.close();
    }
  } finally {
    audioInputStream.close();
  }
}
...