問題は、サウンドクリップを再生する前にメインアプリケーションスレッドが終了することです。Thread.sleep
の後に任意のタイムアウトで呼び出すことができますが、再生中にオーディオデータを追跡するclip.start()
ための専用を作成することをお勧めします。Thread
public class PlayAudio {
AudioFormat audioFormat;
AudioInputStream audioInputStream;
SourceDataLine sourceDataLine;
boolean stopPlayback = false;
public void playAudio(File soundFile) throws UnsupportedAudioFileException,
IOException, LineUnavailableException {
audioInputStream = AudioSystem.getAudioInputStream(soundFile);
audioFormat = audioInputStream.getFormat();
DataLine.Info dataLineInfo = new DataLine.Info(SourceDataLine.class, audioFormat);
sourceDataLine = (SourceDataLine) AudioSystem.getLine(dataLineInfo);
new Thread(new PlayThread()).start();
}
public static void main(String[] args) throws UnsupportedAudioFileException, IOException, LineUnavailableException {
new PlayAudio().playAudio(new File("myclip.wav"));
}
class PlayThread implements Runnable {
byte soundBuffer[] = new byte[10000];
@Override
public void run() {
try {
sourceDataLine.open(audioFormat);
sourceDataLine.start();
int cnt;
while ((cnt = audioInputStream.read(soundBuffer, 0,
soundBuffer.length)) != -1 && stopPlayback == false) {
if (cnt > 1) {
sourceDataLine.write(soundBuffer, 0, cnt);
}
}
sourceDataLine.drain();
sourceDataLine.close();
stopPlayback = false;
} catch (Exception e) {
e.printStackTrace();
}
}
}
}