如何用java播放.wav文件
我正在尝试使用Java播放* .wav文件。 我希望它做到以下几点:
当按下一个button时,发出短促的哔声。
我GOOGLE了,但大部分代码不起作用。 有人可以给我一个简单的代码段来播放.wav文件吗?
最后,我设法做到以下,它工作正常
import java.io.File; import java.io.IOException; 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; public class MakeSound { private final int BUFFER_SIZE = 128000; private File soundFile; private AudioInputStream audioStream; private AudioFormat audioFormat; private SourceDataLine sourceLine; /** * @param filename the name of the file that is going to be played */ public void playSound(String filename){ String strFilename = filename; try { soundFile = new File(strFilename); } catch (Exception e) { e.printStackTrace(); System.exit(1); } try { audioStream = AudioSystem.getAudioInputStream(soundFile); } catch (Exception e){ e.printStackTrace(); System.exit(1); } audioFormat = audioStream.getFormat(); DataLine.Info info = new DataLine.Info(SourceDataLine.class, audioFormat); try { sourceLine = (SourceDataLine) AudioSystem.getLine(info); sourceLine.open(audioFormat); } catch (LineUnavailableException e) { e.printStackTrace(); System.exit(1); } catch (Exception e) { e.printStackTrace(); System.exit(1); } sourceLine.start(); int nBytesRead = 0; byte[] abData = new byte[BUFFER_SIZE]; while (nBytesRead != -1) { try { nBytesRead = audioStream.read(abData, 0, abData.length); } catch (IOException e) { e.printStackTrace(); } if (nBytesRead >= 0) { @SuppressWarnings("unused") int nBytesWritten = sourceLine.write(abData, 0, nBytesRead); } } sourceLine.drain(); sourceLine.close(); } }
这里是我可以不使用太阳的最优雅的forms*:
import java.io.*; import javax.sound.sampled.*; try { File yourFile; AudioInputStream stream; AudioFormat format; DataLine.Info info; Clip clip; stream = AudioSystem.getAudioInputStream(yourFile); format = stream.getFormat(); info = new DataLine.Info(Clip.class, format); clip = (Clip) AudioSystem.getLine(info); clip.open(stream); clip.start(); } catch (Exception e) { //whatevers }
最短的forms(无需安装随机库)?
public static void play(String filename) { try { Clip clip = AudioSystem.getClip(); clip.open(AudioSystem.getAudioInputStream(new File(filename))); clip.start(); } catch (Exception exc) { exc.printStackTrace(System.out); } }
唯一的问题是在* .wav结束之后,没有什么好的办法可以使这个方法阻塞closures和处理数据。 clip.drain()
表示阻塞,但事实并非如此。 start()
后剪辑没有运行。 唯一的工作,但丑陋的方式,我发现是:
// ... clip.start(); while (!clip.isRunning()) Thread.sleep(10); while (clip.isRunning()) Thread.sleep(10); clip.close();
您可以使用事件侦听器在播放后closures剪辑
import java.io.File; import javax.sound.sampled.*; public void play(File file) { try { final Clip clip = (Clip)AudioSystem.getLine(new Line.Info(Clip.class)); clip.addLineListener(new LineListener() { @Override public void update(LineEvent event) { if (event.getType() == LineEvent.Type.STOP) clip.close(); } }); clip.open(AudioSystem.getAudioInputStream(file)); clip.start(); } catch (Exception exc) { exc.printStackTrace(System.out); } }
这里的代码片段工作正常,用Windows声音testing:
public static void main(String[] args) { AePlayWave aw = new AePlayWave( "C:\\WINDOWS\\Media\\tada.wav" ); aw.start(); }
没有Javareflection的解决schemeDataLine.Info info = new DataLine.Info(SourceDataLine.class,audioFormat); Javareflection降低性能。 运行:java playsound absoluteFilePathTo / file.wav
import javax.sound.sampled.*; import java.io.*; public class playsound { public static void main (String args[]) throws Exception { playSound ( args [0] ); } public static void playSound ( String filename ) throws Exception { AudioInputStream audioStream = AudioSystem.getAudioInputStream ( new File (filename) ); int BUFFER_SIZE = 128000; AudioFormat audioFormat = null; SourceDataLine sourceLine = null; audioFormat = audioStream.getFormat(); sourceLine = (SourceDataLine) AudioSystem.getSourceDataLine ( audioFormat ); sourceLine.open ( audioFormat ); sourceLine.start(); int nBytesRead = 0; byte[] abData = new byte[BUFFER_SIZE]; while (nBytesRead != -1) { try { nBytesRead = audioStream.read ( abData, 0, abData.length ); } catch (IOException e) { e.printStackTrace(); } if (nBytesRead >= 0) { int nBytesWritten = sourceLine.write ( abData, 0, nBytesRead ); } } sourceLine.drain(); sourceLine.close(); } }
一个将播放WAV文件的类,直到声音播放完成才阻止:
class Sound implements Playable { private final Path wavPath; private final CyclicBarrier barrier = new CyclicBarrier(2); Sound(final Path wavPath) { this.wavPath = wavPath; } @Override public void play() throws LineUnavailableException, IOException, UnsupportedAudioFileException { try (final AudioInputStream audioIn = AudioSystem.getAudioInputStream(wavPath.toFile()); final Clip clip = AudioSystem.getClip()) { listenForEndOf(clip); clip.open(audioIn); clip.start(); waitForSoundEnd(); } } private void listenForEndOf(final Clip clip) { clip.addLineListener(event -> { if (event.getType() == LineEvent.Type.STOP) waitOnBarrier(); }); } private void waitOnBarrier() { try { barrier.await(); } catch (final InterruptedException ignored) { } catch (final BrokenBarrierException e) { throw new RuntimeException(e); } } private void waitForSoundEnd() { waitOnBarrier(); } }
你也可以这样使用AudioStream:
import java.awt.event.ActionEvent; import java.awt.event.ActionListener; import java.io.FileInputStream; import java.io.FileNotFoundException; import java.io.IOException; import java.io.InputStream; import javax.swing.JButton; import javax.swing.JFrame; import javax.swing.JPanel; import sun.audio.AudioPlayer; import sun.audio.AudioStream; public class AudioWizz extends JPanel implements ActionListener { private static final long serialVersionUID = 1L; //you like your cereal and the program likes their "serial" static AudioWizz a; static JButton playBuddon; static JFrame frame; public static void main(String arguments[]){ frame= new JFrame("AudioWizz"); frame.setSize(300,300); frame.setVisible(true); a= new AudioWizz(); playBuddon= new JButton("PUSH ME"); playBuddon.setBounds(10,10,80,30); playBuddon.addActionListener(a); frame.add(playBuddon); frame.add(a); } public void actionPerformed(ActionEvent e){ //an eventListener if (e.getSource() == playBuddon) { try { InputStream in = new FileInputStream("*.wav"); AudioStream sound = new AudioStream(in); AudioPlayer.player.start(sound); } catch(FileNotFoundException e1) { e1.printStackTrace(); } catch (IOException e1) { e1.printStackTrace(); } } } }
AudioInputStream
另一种方法:
import java.io.File; import javax.sound.sampled.AudioInputStream; import javax.sound.sampled.AudioSystem; import javax.sound.sampled.Clip; import javax.sound.sampled.Line; import javax.sound.sampled.LineEvent; import javax.sound.sampled.LineListener; import javax.swing.JDialog; import javax.swing.JFileChooser; public class CoreJavaSound extends Object implements LineListener { File soundFile; JDialog playingDialog; Clip clip; public static void main(String[] args) throws Exception { CoreJavaSound s = new CoreJavaSound(); } public CoreJavaSound() throws Exception { JFileChooser chooser = new JFileChooser(); chooser.showOpenDialog(null); soundFile = chooser.getSelectedFile(); System.out.println("Playing " + soundFile.getName()); Line.Info linfo = new Line.Info(Clip.class); Line line = AudioSystem.getLine(linfo); clip = (Clip) line; clip.addLineListener(this); AudioInputStream ais = AudioSystem.getAudioInputStream(soundFile); clip.open(ais); clip.start(); } public void update(LineEvent le) { LineEvent.Type type = le.getType(); if (type == LineEvent.Type.OPEN) { System.out.println("OPEN"); } else if (type == LineEvent.Type.CLOSE) { System.out.println("CLOSE"); System.exit(0); } else if (type == LineEvent.Type.START) { System.out.println("START"); playingDialog.setVisible(true); } else if (type == LineEvent.Type.STOP) { System.out.println("STOP"); playingDialog.setVisible(false); clip.close(); } } }