嗯,标题说的全部,我尝试使用javax.sound播放一个wav文件,但没有任何事情发生。我没有运气就试过很多不同的文件。
public static void main(String[] args) throws IOException, UnsupportedAudioFileException, LineUnavailableException
{
File in = new File("C:\\Users\\Sandra\\Desktop\\music\\rags.wav");
AudioInputStream audioInputStream = AudioSystem.getAudioInputStream(in);
Clip play = AudioSystem.getClip();
play.open(audioInputStream);
FloatControl volume= (FloatControl) play.getControl(FloatControl.Type.MASTER_GAIN);
volume.setValue(1.0f); // Reduce volume by 10 decibels.
play.start();
}
答案 0 :(得分:7)
因为,已经开始声明,你需要阻止主线程退出,因为这会导致JVM终止。
Clip#start
不是阻塞调用,这意味着它会在调用后很快返回。
我毫不怀疑有很多方法可以解决这个问题,这只是其中一个问题的一个简单例子。
public class PlayMusic {
public static void main(String[] args) throws InterruptedException {
Clip play = null;
try {
File in = new File("C:\\Users\\Public\\Music\\Sample Music\\Kalimba.wav");
AudioInputStream audioInputStream = AudioSystem.getAudioInputStream(in);
play = AudioSystem.getClip();
play.open(audioInputStream);
FloatControl volume = (FloatControl) play.getControl(FloatControl.Type.MASTER_GAIN);
volume.setValue(1.0f); // Reduce volume by 10 decibels.
play.start();
// Loop until the Clip is not longer running.
// We loop this way to allow the line to fill, otherwise isRunning will
// return false
//do {
// Thread.sleep(15);
//} while (play.isRunning());
play.drain();
} catch (UnsupportedAudioFileException | IOException | LineUnavailableException ex) {
ex.printStackTrace();
} finally {
try {
play.close();
} catch (Exception exp) {
}
}
System.out.println("...");
}
}
实际的解决方案取决于您的需求。
答案 1 :(得分:4)
Java的声音Clip
需要有效Thread
来播放音频输入文件,否则应用程序会在播放文件之前退出。你可以添加
JOptionPane.showMessageDialog(null, "Click OK to stop music");
致电start
。
答案 2 :(得分:3)
播放音频片段的正确方法是按Playing Back Audio。
中的说明排空线路所以你的主要应该是这样的:
public static void main(String[] args) throws IOException,
UnsupportedAudioFileException, LineUnavailableException
{
File in = new File("C:\\Users\\Sandra\\Desktop\\music\\rags.wav");
AudioInputStream audioInputStream = AudioSystem.getAudioInputStream(in);
Clip play = AudioSystem.getClip();
play.open(audioInputStream);
FloatControl volume= (FloatControl) play.getControl(FloatControl.Type.MASTER_GAIN);
volume.setValue(1.0f); // Reduce volume by 10 decibels.
play.start();
play.drain();
play.close();
}
play.drain()
阻止,直到播放完所有数据。
答案 3 :(得分:2)
public static void main(String[] args) throws Exception {
File in = new File("C:\\Users\\Sandra\\Desktop\\music\\rags.wav");
AudioInputStream audioInputStream = AudioSystem.getAudioInputStream(in);
Clip play = AudioSystem.getClip();
play.open(audioInputStream);
FloatControl volume= (FloatControl)play.getControl(FloatControl.Type.MASTER_GAIN);
volume.setValue(1.0f); // Reduce volume by 10 decibels.
play.start();
SwingUtilities.invokeLater(new Runnable() {
public void run() {
// A GUI element to prevent the Clip's daemon Thread
// from terminating at the end of the main()
JOptionPane.showMessageDialog(null, "Close to exit!");
}
});
}
答案 4 :(得分:0)
您的节目在声音有时间播放之前终止。我会以某种线程方式(play.start();
,...)进行invokeLater
,并找到一种等待声音结束的方法(Reimeus建议一个)。
领导:
public static void main(String[] args) {
javax.swing.SwingUtilities.invokeLater(new Runnable() {
public void run() {
...
play.start();
JOptionPane.showMessageDialog(null, "Click OK to stop music");
}
});
}
答案 5 :(得分:0)
如果您只想播放音频,这是一种方法。
audioFileDirectory
字符串变量需要正确的音频文件路径,否则将引发异常,并且程序将无法运行。
在使用IDE的项目中具有正确的音频文件目录的示例:
src
文件夹中创建一个文件夹,例如“音乐”,然后在其中放置音频文件audioFileDirectory = "/music/name_of_audio_file";
音频播放的重要部分是程序的主线程需要以某种方式保持“活跃”状态,因此该行
Thread.sleep(audio.getMicrosecondLength()/1000);
是主线程处于“活动”状态的位置,参数audio.getMicrosecondLength()/1000
是将处于“活动”状态的时间,即音频文件的整个长度。
public class AudioTest
{
void playAudio() throws Exception
{
String audioFileDirectory = "your_audioFileDirectory";
InputStream is = getClass().getResourceAsStream(audioFileDirectory);
BufferedInputStream bis = new BufferedInputStream(is);
AudioInputStream ais = AudioSystem.getAudioInputStream(bis);
Clip audio = AudioSystem.getClip();
audio.open(ais);
audio.loop(Clip.LOOP_CONTINUOUSLY);
audio.start();
Thread.sleep(audio.getMicrosecondLength()/1000);
audio.close();
} // end playAudio
public static void main(String[] args)
{
try
{
new AudioTest().playAudio();
}
catch (Exception e)
{
System.out.println("Class: " + e.getClass().getName());
System.out.println("\nMessage:\n" + e.getMessage() + "\n");
e.printStackTrace();
}
} // end main
} // end class AudioTest