AudioInputStream
необходим в качестве аргумента для открытия Clip
. Посмотрев на API, вы увидите, что AudioSystem.getAudioInputStream (InputStream) или AudioSystem.getAudioInputStream (URL) можно использовать для получения AudioInputStream .
Существует два метода Class
, которые служат: getResource(String)
или getResourceAsStream(String)
. Метод getResource вернет URL
. Метод getResourceAsStream вернет InputStream
.
Я предпочитаю использовать форму URL, так как она более щадящая. При использовании AudioSystem.getAudioInputStream (InputStream) , IOException
будет возвращено, если файл не поддерживает маркировку и сброс . Метод AudioSystem.getAudioInputStream (URL) обходит это требование.
Кроме того, вы должны знать, что URL
, в отличие от File
, может использоваться для идентификации файла, который находится в банке.
Вы также должны быть осторожны при установке относительного адреса. Я обычно хотел бы иметь файл / res или / audio , содержащий файл .wav для загрузки. Например, вы можете использовать « .. / res / myAudio.wav », если / res - параллельная папка, или « res / myAudio.wav », если / res - это подпапка относительно расположения класса, используемого в методе getResource .
Вот простой рабочий пример, где аудиофайл находится в вложенная папка, / res :
private static void loadAndPlayClip() throws UnsupportedAudioFileException,
IOException, LineUnavailableException, InterruptedException
{
String filename = "a3.wav";
URL url = BasicClipExample.class.getResource("res/" + filename);
AudioInputStream ais = AudioSystem.getAudioInputStream(url);
DataLine.Info info = new DataLine.Info(Clip.class, ais.getFormat());
Clip clip = (Clip) AudioSystem.getLine(info);
clip.open(ais);
clip.start();
Thread.sleep(7000); // Duration should match length of audio file.
clip.close();
}
Хотя этот пример должен работать, его не следует использовать как в производстве по двум причинам.
Команда Thread.sleep()
останавливает основной поток, что обычно не желательно и не нужно. Поток, который система создает для воспроизведения Clip
, является потоком daemon . Потоки Daemon не будут препятствовать завершению и завершению программы. В этом простом примере «запускай и забывай» основной поток выполняется быстро, поэтому программа будет немедленно закрыта, если мы не сохраним завершение с интервалом ожидания.
Начальный загрузка Clip
и игра Clip
обычно выполняются двумя отдельными способами. A Clip
был разработан для аудио, которое удобно хранить в памяти, что позволяет воспроизводить его без перезагрузки. Если вы перезагрузите Clip
с каждой командой воспроизведения, вы будете одновременно выполнять ненужную работу и добавлять задержку, так как клип не начнет воспроизводиться, пока он не будет полностью загружен. Если аудиофайл неудобно хранить в памяти (например, большой файл из-за большой длительности), предпочтительным способом является его воспроизведение с SourceDataLine
.