9 ответов:
Я написал следующий код, который прекрасно работает. Но я думаю, что это работает только с .
public static synchronized void playSound(final String url) { new Thread(new Runnable() { // The wrapper thread is unnecessary, unless it blocks on the // Clip finishing; see comments. public void run() { try { Clip clip = AudioSystem.getClip(); AudioInputStream inputStream = AudioSystem.getAudioInputStream( Main.class.getResourceAsStream("/path/to/sounds/" + url)); clip.open(inputStream); clip.start(); } catch (Exception e) { System.err.println(e.getMessage()); } } }).start(); }
The Звуковая Дорожка из учебника Java стоит быть отправной точкой.
плохой пример:
import sun.audio.*; //import the sun.audio package import java.io.*; //** add this into your application code as appropriate // Open an input stream to the audio file. InputStream in = new FileInputStream(Filename); // Create an AudioStream object from the input stream. AudioStream as = new AudioStream(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);
Я не хотел иметь так много строк кода только для воспроизведения простого проклятого звука. Это может работать, если у вас есть пакет JavaFX (уже включен в мой jdk 8).
private static void playSound(String sound){ // cl is the ClassLoader for the current class, ie. CurrentClass.class.getClassLoader(); URL file = cl.getResource(sound); final Media media = new Media(file.toString()); final MediaPlayer mediaPlayer = new MediaPlayer(media); mediaPlayer.play(); }обратите внимание: вам нужно инициализировать JavaFX. Быстрый способ сделать это-вызвать конструктор JFXPanel () один раз в вашем приложении :
static{ JFXPanel fxPanel = new 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. public class SoundClipTest extends JFrame { public SoundClipTest() { 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(); } } public static void main(String[] args) { new SoundClipTest(); } }
по какой-то причине верхний ответ wchargin давал мне ошибку нулевого указателя, когда я вызывал это.getClass().getResourceAsStream ().
что сработало для меня было следующее:
void playSound(String soundFile) { File f = new File("./" + soundFile); audioIn = AudioSystem.getAudioInputStream(f.toURI().toURL()); Clip clip = AudioSystem.getClip(); clip.open(audioIn); clip.start(); }и я бы играл звук с:
playSound("sounds/effects/sheep1.wav");звуки/эффекты/sheep1.wav был расположен в базовом каталоге моего проекта в Eclipse (поэтому не внутри папки src).
существует альтернатива импорту звуковых файлов, которая работает как в апплетах, так и в приложениях: конвертируйте аудиофайлы.Java-файлы и просто использовать их в коде.
Я разработал инструмент, который делает этот процесс намного проще. Это упрощает JAVA Sound API совсем немного.
Я создал игровой фреймворк некоторое время назад для работы на Android и Desktop, часть рабочего стола, которая обрабатывает звук, возможно, может быть использована в качестве вдохновения для того, что вам нужно.
вот код для ссылки.
package com.athanazio.jaga.desktop.sound; import java.io.BufferedInputStream; import java.io.IOException; import java.io.InputStream; import javax.sound.sampled.AudioFormat; import javax.sound.sampled.AudioInputStream; import javax.sound.sampled.AudioSystem; import javax.sound.sampled.DataLine; import javax.sound.sampled.LineUnavailableException; import javax.sound.sampled.SourceDataLine; import javax.sound.sampled.UnsupportedAudioFileException; public class Sound { AudioInputStream in; AudioFormat decodedFormat; AudioInputStream din; AudioFormat baseFormat; SourceDataLine line; private boolean loop; private BufferedInputStream stream; // private ByteArrayInputStream stream; /** * recreate the stream * */ public void reset() { try { stream.reset(); in = AudioSystem.getAudioInputStream(stream); din = AudioSystem.getAudioInputStream(decodedFormat, in); line = getLine(decodedFormat); } catch (Exception e) { e.printStackTrace(); } } public void close() { try { line.close(); din.close(); in.close(); } catch (IOException e) { } } Sound(String filename, boolean loop) { this(filename); this.loop = loop; } Sound(String filename) { this.loop = false; try { InputStream raw = Object.class.getResourceAsStream(filename); stream = new BufferedInputStream(raw); // ByteArrayOutputStream out = new ByteArrayOutputStream(); // byte[] buffer = new byte[1024]; // int read = raw.read(buffer); // while( read > 0 ) { // out.write(buffer, 0, read); // read = raw.read(buffer); // } // stream = new ByteArrayInputStream(out.toByteArray()); in = AudioSystem.getAudioInputStream(stream); din = null; if (in != null) { baseFormat = in.getFormat(); decodedFormat = new AudioFormat( AudioFormat.Encoding.PCM_SIGNED, baseFormat .getSampleRate(), 16, baseFormat.getChannels(), baseFormat.getChannels() * 2, baseFormat .getSampleRate(), false); din = AudioSystem.getAudioInputStream(decodedFormat, in); line = getLine(decodedFormat); } } catch (UnsupportedAudioFileException e) { e.printStackTrace(); } catch (IOException e) { e.printStackTrace(); } catch (LineUnavailableException e) { e.printStackTrace(); } } private SourceDataLine getLine(AudioFormat audioFormat) throws LineUnavailableException { SourceDataLine res = null; DataLine.Info info = new DataLine.Info(SourceDataLine.class, audioFormat); res = (SourceDataLine) AudioSystem.getLine(info); res.open(audioFormat); return res; } public void play() { try { boolean firstTime = true; while (firstTime || loop) { firstTime = false; byte[] data = new byte[4096]; if (line != null) { line.start(); int nBytesRead = 0; while (nBytesRead != -1) { nBytesRead = din.read(data, 0, data.length); if (nBytesRead != -1) line.write(data, 0, nBytesRead); } line.drain(); line.stop(); line.close(); reset(); } } } catch (IOException e) { e.printStackTrace(); } } }
этот поток довольно старый, но я решил, что может оказаться полезным.
вместо того, чтобы использовать Java
AudioStreamбиблиотека вы можете использовать внешнюю программу, такую как 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();конечно, это займет больше времени, чем при использовании внутренней библиотеки, но может быть программы, которые могут запускаться быстрее и, возможно, без графического интерфейса с определенными консольными командами.
Если время не имеет значения, то это полезно.
Comments