+1 за решение, которое использует публичный API. Не является ли создание нового потока ненужным (избыточным)?
Jataro
4
Спасибо .. Это избыточно? Я создал новую тему, чтобы снова воспроизвести звук до окончания первого клипа.
пекин
4
Я знаю, что clip.start () порождает новый поток, поэтому я почти уверен, что в этом нет необходимости.
Jataro
44
1) Threadненужный 2) Хороший пример использования Clipсмотрите в информации о JavaSound. стр . 3) Если метод требует URL(или File) дать ему опасность URL(или File), а не принять то, Stringчто представляет его. (Просто личная «пчела в моем капоте».) 4) e.printStackTrace();предоставляет больше информации с меньшим набором текста, чем System.err.println(e.getMessage());.
Эндрю Томпсон
18
Плохой пример:
import sun.audio.*;//import the sun.audio packageimport java.io.*;//** add this into your application code as appropriate// Open an input stream to the audio file.InputStream in =newFileInputStream(Filename);// Create an AudioStream object from the input stream.AudioStream as =newAudioStream(in);// Use the static class member "player" from class AudioPlayer to play// clip.AudioPlayer.player.start(as);// Similarly, to stop the audio.AudioPlayer.player.stop(as);
@GregHurlman Разве пакет sun. * Сделан не для использования нами, разработчиками?
Том Брито
36
Этот пример взят из статьи JavaWorld 1997 года. Вы устарели, вы НЕ должны использовать пакеты sun. *.
sproketboy
3
Вам когда-нибудь нужно закрыть "в"?
rogerdpack
6
+1 за не использование солнца. * Пакеты. У них есть странные ошибки, такие как отсутствие обработки файлов размером более 1 МБ и невозможность воспроизведения одного клипа, если предыдущий еще не закончен, и т. Д.
rogerdpack
10
Я не хотел иметь так много строк кода, чтобы играть просто чертовски звучащий звук. Это может работать, если у вас есть пакет JavaFX (уже включен в мой jdk 8).
privatestaticvoid playSound(String sound){// cl is the ClassLoader for the current class, ie. CurrentClass.class.getClassLoader();
URL file = cl.getResource(sound);finalMedia media =newMedia(file.toString());finalMediaPlayer mediaPlayer =newMediaPlayer(media);
mediaPlayer.play();}
Примечание: вам нужно инициализировать JavaFX . Быстрый способ сделать это - вызвать конструктор JFXPanel () один раз в вашем приложении:
Для воспроизведения звука в Java, вы можете обратиться к следующему коду.
import java.io.*;import java.net.URL;import javax.sound.sampled.*;import javax.swing.*;// To play sound using Clip, the process need to be alive.// Hence, we use a Swing application.publicclassSoundClipTestextendsJFrame{publicSoundClipTest(){this.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);this.setTitle("Test Sound Clip");this.setSize(300,200);this.setVisible(true);try{// Open an audio input stream.
URL url =this.getClass().getClassLoader().getResource("gameover.wav");AudioInputStream audioIn =AudioSystem.getAudioInputStream(url);// Get a sound clip resource.Clip clip =AudioSystem.getClip();// Open audio clip and load samples from the audio input stream.
clip.open(audioIn);
clip.start();}catch(UnsupportedAudioFileException e){
e.printStackTrace();}catch(IOException e){
e.printStackTrace();}catch(LineUnavailableException e){
e.printStackTrace();}}publicstaticvoid main(String[] args){newSoundClipTest();}}
Привет, Эндрю, твой код работал на меня, но я заметил, что на выполнение уходит немного больше времени ... около 1,5 сек.
getResourceAsStream()вернусь , nullесли ресурс не найден, или выбросить исключение , если nameестьnull - не ошибка верхнего ответа, если указанный путь недействителен
user85421
3
Некоторое время назад я создал игровой фреймворк для работы на Android и настольном компьютере, часть рабочего стола, которая обрабатывает звук, может быть использована как вдохновение для того, что вам нужно.
Я на самом деле решил эту проблему, используя raw.mark(raw.available()+1)после инициализации rawи затем в цикле while, а затем используя raw.reset()вместо stream.reset(). Моя проблема сейчас в том, что когда дело доходит до сброса, между играми возникает разрыв. Я хочу добиться непрерывного цикла, как вы получаете с Clip. Я не использую, Clipпотому что манипулирование элементами управления, такими как MASTER_GAIN, имеет заметную задержку ~ 500 мс. Вероятно, это должен быть отдельный вопрос, который я собираюсь задать позже.
Дрима
Не а do { ... } while?
Андреас
2
Существует альтернатива импортированию звуковых файлов, которая работает как в апплетах, так и в приложениях: конвертировать аудиофайлы в файлы .java и просто использовать их в своем коде.
Я разработал инструмент, который делает этот процесс намного проще. Это немного упрощает Java Sound API.
Я использовал вашу систему для создания класса из файла WAV, однако, когда я делаю my_wave.play (); он не воспроизводит звук .. Есть ли аудиосистема, которую мне нужно инициализировать или что-то в этом роде? ..
Натан Ф.
это было бы действительно здорово, если бы это действительно работало. При запуске play () происходит сбой получения Audio Line (исключение "java.lang.IllegalArgumentException: нет интерфейса для соответствия строк SourceDataLine, поддерживающий формат PCM_UNSIGNED 44100,0 Гц, 16 бит, стерео, 4 байта / кадр, little-endian поддерживается." выброшен). Печальный.
phil294
2
Я удивлен, что никто не предложил использовать Апплет. ИспользованиеApplet . Вы должны будете предоставить звуковой файл звукового сигнала как wavфайл, но он работает. Я попробовал это на Ubuntu:
package javaapplication2;import java.applet.Applet;import java.applet.AudioClip;import java.io.File;import java.net.MalformedURLException;import java.net.URL;publicclassJavaApplication2{publicstaticvoid main(String[] args)throwsMalformedURLException{File file =newFile("/path/to/your/sounds/beep3.wav");
URL url =null;if(file.canRead()){url = file.toURI().toURL();}System.out.println(url);AudioClip clip =Applet.newAudioClip(url);
clip.play();System.out.println("should've played by now");}}//beep3.wav was available from: http://www.pacdv.com/sounds/interface_sound_effects/beep-3.wav
Эта ветка довольно старая, но я определил вариант, который может оказаться полезным.
Вместо использования AudioStreamбиблиотеки Java вы можете использовать внешнюю программу, такую как Windows Media Player или VLC, и запускать ее с помощью консоли через Java.
String command ="\"C:/Program Files (x86)/Windows Media Player/wmplayer.exe\" \"C:/song.mp3\"";try{Process p =Runtime.getRuntime().exec(command);catch(IOException e){
e.printStackTrace();}
Это также создаст отдельный процесс, которым может управлять программа.
p.destroy();
Конечно, это займет больше времени, чем при использовании внутренней библиотеки, но могут быть программы, которые могут запускаться быстрее, и, возможно, без графического интерфейса пользователя, получающего определенные консольные команды.
Хотя я думаю, что это объективно плохое решение (с точки зрения надежности, эффективности и других подобных показателей), оно, по крайней мере, интересное, о котором я бы и не подумал!
Ответы:
Я написал следующий код, который отлично работает. Но я думаю, что это работает только с
.wav
форматом.источник
Thread
ненужный 2) Хороший пример использованияClip
смотрите в информации о JavaSound. стр . 3) Если метод требуетURL
(илиFile
) дать ему опасностьURL
(илиFile
), а не принять то,String
что представляет его. (Просто личная «пчела в моем капоте».) 4)e.printStackTrace();
предоставляет больше информации с меньшим набором текста, чемSystem.err.println(e.getMessage());
.Плохой пример:
источник
Я не хотел иметь так много строк кода, чтобы играть просто чертовски звучащий звук. Это может работать, если у вас есть пакет JavaFX (уже включен в мой jdk 8).
Примечание: вам нужно инициализировать JavaFX . Быстрый способ сделать это - вызвать конструктор JFXPanel () один раз в вашем приложении:
источник
Для воспроизведения звука в Java, вы можете обратиться к следующему коду.
источник
По какой-то причине верхний ответ от wchargin давал мне ошибку нулевого указателя, когда я вызывал this.getClass (). GetResourceAsStream ().
То, что работало для меня, было следующим:
И я бы сыграл звук с:
sounds / Effects / sheep1.wav находился в базовой директории моего проекта в Eclipse (поэтому не в папке src).
источник
getResourceAsStream()
вернусь ,null
если ресурс не найден, или выбросить исключение , еслиname
естьnull
- не ошибка верхнего ответа, если указанный путь недействителенНекоторое время назад я создал игровой фреймворк для работы на Android и настольном компьютере, часть рабочего стола, которая обрабатывает звук, может быть использована как вдохновение для того, что вам нужно.
https://github.com/hamilton-lima/jaga/blob/master/jaga%20desktop/src-desktop/com/athanazio/jaga/desktop/sound/Sound.java
Вот код для справки.
источник
stream.reset();
привести к ошибкеResetting to invalid mark
. Что вы предлагаете сделать, чтобы это исправить?raw.mark(raw.available()+1)
после инициализацииraw
и затем в цикле while, а затем используяraw.reset()
вместоstream.reset()
. Моя проблема сейчас в том, что когда дело доходит до сброса, между играми возникает разрыв. Я хочу добиться непрерывного цикла, как вы получаете сClip
. Я не использую,Clip
потому что манипулирование элементами управления, такими как MASTER_GAIN, имеет заметную задержку ~ 500 мс. Вероятно, это должен быть отдельный вопрос, который я собираюсь задать позже.do { ... } while
?Существует альтернатива импортированию звуковых файлов, которая работает как в апплетах, так и в приложениях: конвертировать аудиофайлы в файлы .java и просто использовать их в своем коде.
Я разработал инструмент, который делает этот процесс намного проще. Это немного упрощает Java Sound API.
http://stephengware.com/projects/soundtoclass/
источник
Я удивлен, что никто не предложил использовать Апплет. Использование
Applet
. Вы должны будете предоставить звуковой файл звукового сигнала какwav
файл, но он работает. Я попробовал это на Ubuntu:источник
Applet
устарела с Java 9.Эта ветка довольно старая, но я определил вариант, который может оказаться полезным.
Вместо использования
AudioStream
библиотеки Java вы можете использовать внешнюю программу, такую как Windows Media Player или VLC, и запускать ее с помощью консоли через Java.Это также создаст отдельный процесс, которым может управлять программа.
Конечно, это займет больше времени, чем при использовании внутренней библиотеки, но могут быть программы, которые могут запускаться быстрее, и, возможно, без графического интерфейса пользователя, получающего определенные консольные команды.
Если время не имеет значения, тогда это полезно.
источник