我想玩一个
PCM_UNSIGNED 11025.0 Hz, 8 bit, mono, 1 bytes/frame
第一种方法有效,但我不想依赖
sun.*
东西。第二个结果只播放了一些前导帧,听起来更像是点击。不可能是 IO 问题,因为我正在从 ByteArrayInputStream 播放。
为什么会这样?
我不确定为什么您链接到的第二种方法会启动另一个线程;我相信音频无论如何都会在自己的线程中播放。问题是您的应用程序在剪辑播放完之前就结束了吗?
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();
}
}