方法1:
package za;
import java.applet.Applet;
import java.applet.AudioClip;
import java.io.File;
import java.net.URL;
public class Music {
public Music()
{
try
{
// URL url=new URL("file:\\D:\\清明雨上.wav");
URL url=new URL("file:"+File.separator+"D:"+File.separator+"清明雨上.wav");
AudioClip ac=Applet.newAudioClip(url);
ac.play(); //ac.stop();
}
catch(Exception e)
{
System.out.println(e);
}
}
public static void main(String[] args) {
// TODO Auto-generated method stub
new Music();
}
}
方法2:
使用AudioStream,需要导入
import sun.audio.AudioPlayer;
import sun.audio.AudioStream;
上面这两句都报“Access restriction: The type AudioPlayer is not accessible due to restriction on required library C:\JDK1.5\jre\lib\rt.jar”的错误,解决办法::在preference->java->complier->errors/warning->deprecated and restricted API把 Forbidden reference 的Error改成warning 即可,参考http://www.cnblogs.com/Cratical/archive/2011/05/11/2043756.html 原因。
package za;
import sun.audio.AudioPlayer;
import sun.audio.AudioStream;
import java.io.*;
public class Sound
{
public static void main(String args[])
{
try
{
FileInputStream file=new FileInputStream("D:\\清明雨上.wav");
AudioStream as=new AudioStream(file);
AudioPlayer.player.start(as);
}catch (Exception e) {}
}
}
方法3:
使用AudioInputStream
程序运行正常,但没声音的解决方法:
没声音?
JDK 5 发行版中有个讨厌的小错误:在有些平台上,对于一些短的音频片段,代码看上去运行正常,但就是 ... 没声音。显然媒体播放器在应该出现的位置之前触发了 STOP
事件。(见 参考资料 一节中错误页的链接。)
这个错误 “无法修复”,但解决方法相当简单:注册一个 LineListener
来监听 STOP
事件,当触发时,调用片段对象的 notifyAll()
。然后在 “调用者” 代码中,通过调用 wait()
等待片段完成(还调用 notifyAll()
)。在没出现错误的平台上,这些错误是多余的,在 Windows® 及有些 Linux® 版本上,会让程序员 “开心” 或 “愤怒”。
package za;
import java.io.File;
import javax.sound.sampled.*;
public class MusicTest
{
public static void main(String args[])
{
try{
new MusicTest().playClip("D:"+File.separator+"清明雨上.wav");
}catch(Exception e)
{
e.printStackTrace();
}
}
public void playClip(String audioFile)
{
try
{
/* AudioInputStream inputStream =
AudioSystem.getAudioInputStream(
this.getClass().getResourceAsStream(audioFile));*/
AudioInputStream inputStream=AudioSystem.getAudioInputStream(new File(audioFile));
DataLine.Info info =
new DataLine.Info( Clip.class, inputStream.getFormat());
final Clip clip = (Clip) AudioSystem.getLine(info);
clip.addLineListener(new LineListener() {
public void update(LineEvent e) {
if (e.getType() == LineEvent.Type.STOP) {
synchronized(clip) {
clip.notify();
}
}
}
});
clip.open(inputStream);
clip.setFramePosition(0);
clip.start();
synchronized (clip) {
clip.wait();
}
clip.drain();
clip.close();
}
catch (Exception ex)
{
ex.printStackTrace();
}
}
}
方法4:
package za;
import java.io.File;
import javax.sound.sampled.*;
public class MusicTest
{
public static void main(String args[])
{
try{
AudioInputStream ais=AudioSystem.getAudioInputStream(new File("D:\\清明雨上.wav"));
AudioFormat baseFormat=ais.getFormat();
System.out.println("baseFormat="+baseFormat);
DataLine.Info info=new DataLine.Info(SourceDataLine.class, baseFormat);
System.out.println("info="+info);
SourceDataLine line=(SourceDataLine)AudioSystem.getLine(info);
System.out.println("line="+line);
line.open(baseFormat);
line.start();
int BUFFER_SIZE=4000*4;
int intBytes=0;
int outBytes;
byte[] audioData=new byte[BUFFER_SIZE];
while(intBytes!=-1)
{
intBytes=ais.read(audioData, 0, BUFFER_SIZE);
if(intBytes>=0)
outBytes=line.write(audioData, 0, intBytes);
}
}catch(Exception e)
{
e.printStackTrace();
}
}
}
方法5:
package za;
import javax.sound.sampled.AudioInputStream;
import javax.sound.sampled.AudioSystem;
import javax.sound.sampled.AudioFormat;
import javax.sound.sampled.DataLine;
import javax.sound.sampled.SourceDataLine;
import java.io.File;
public class BasicPlayer {
private AudioInputStream stream = null;
private AudioFormat format = null;
private SourceDataLine m_line;
public void play(File fileName)
{
try {
stream = AudioSystem.getAudioInputStream(fileName);
// At present, ALAW and ULAW encodings must be converted
// to PCM_SIGNED before it can be played
format = stream.getFormat();
if (format.getEncoding() != AudioFormat.Encoding.PCM_SIGNED) {
format = new AudioFormat(
AudioFormat.Encoding.PCM_SIGNED,
format.getSampleRate(),
16,
format.getChannels(),
format.getChannels() * 2,
format.getSampleRate(),
false); // big endian
stream = AudioSystem.getAudioInputStream(format, stream);
}
// Create the clip
DataLine.Info info = new DataLine.Info(SourceDataLine.class, stream.getFormat(), AudioSystem.NOT_SPECIFIED);
m_line = (SourceDataLine) AudioSystem.getLine(info);
m_line.open(stream.getFormat(),m_line.getBufferSize());
m_line.start();
int numRead = 0;
byte[] buf = new byte[m_line.getBufferSize()];
while ((numRead = stream.read(buf, 0, buf.length)) >= 0) {
int offset = 0;
while (offset < numRead) {
offset += m_line.write(buf, offset, numRead-offset);
}
}
m_line.drain();
m_line.stop();
m_line.close();
stream.close();
} catch (Exception e) {
e.printStackTrace();
}
}
public double getDuration()
{
return m_line.getBufferSize() /
(m_line.getFormat().getFrameSize() * m_line.getFormat().getFrameRate());
}
public double getDecision()
{
return m_line.getMicrosecondPosition()/1000.0;
}
public static void main(String args[])
{
new BasicPlayer().play(new File("D:\\清明雨上.wav"));
}
}
方法六:
播放mid格式音频文件。
package aaa;
import java.io.File;
import javax.sound.midi.MidiSystem;
import javax.sound.midi.Sequence;
import javax.sound.midi.Sequencer;
public class PlayMidi
{
private static File sound;
private static Sequence seq;
private static Sequencer midi;
public static void Play(String filename)
{
try
{
sound = new File(filename);
seq = MidiSystem.getSequence(sound);
// System.setProperty("javax.sound.midi.Sequencer", "com.sun.media.sound.RealTimeSequencerProvider");
midi= MidiSystem.getSequencer();
midi.open();
midi.setSequence(seq);
if(!midi.isRunning())
midi.start();
} catch (Exception ex) {
}
}
public static void Stop()
{
if(midi.isRunning())
midi.stop();
if(midi.isOpen())
midi.close();
}
public static void main(String[] args)
{
PlayMidi.Play("D:\\bg.mid");
long time = midi.getMicrosecondLength()/1000;
try
{
Thread.sleep(time);
} catch (InterruptedException e) {
e.printStackTrace();
}
PlayMidi.Stop();
}
}