Проблемы с воспроизведением wav на Java

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

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

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

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

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


person yanchenko    schedule 23.02.2009    source источник


Ответы (1)


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

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();
  }
}
person Community    schedule 23.02.2009
comment
На самом деле я не запускаю его в отдельном потоке, просто для краткости добавил ссылку. БОЛЬШОЕ СПАСИБО!!! - person yanchenko; 23.02.2009
comment
@Jataro - вы правы; Я пропустил этот вызов в API; Я обновлю код. - person McDowell; 29.07.2009
comment
@lucks - спасибо! Я исправил код. Из документа: После того, как вы начали воспроизведение звука, как вы обнаружите, что он закончился? Выше мы видели одно решение - вызов метода слива после записи последнего буфера данных - но этот подход применим только к SourceDataLine. Другой подход, который работает как для SourceDataLines, так и для Clips, заключается в регистрации для получения уведомлений от линии всякий раз, когда линия меняет свое состояние. Эти уведомления генерируются в виде объектов LineEvent, которых есть четыре типа: OPEN, CLOSE, START и STOP. - person McDowell; 11.05.2011
comment
Получается, что вы должны воспроизвести его в отдельном потоке, который не завершается, пока файл не закончится? (т.е. если основной поток приложения завершается, программа завершается, в отличие от большинства потоковых приложений Java). - person rogerdpack; 27.09.2011
comment
Спасибо за пример кода. Когда я пробую тот же код, я не вижу, чтобы он воспроизводил файл Wav. Он просто ждет, а звука нет. Пытаюсь запустить программу на своем Windows TP. Есть ли какие-то настройки или плеер, которые мне нужно выбрать? Пожалуйста, порекомендуйте. - person Sathish; 15.07.2016