写在前边
考研的日子还是比较无聊的,天天做着同样的事情。现在的日子爱情也比较挫败,一句话,失落期。
所以,这个日志的内容也是相当无聊的情况下写的,如果你发现什么纰漏,请无私指正,谢谢。
昨天在QQ群上有人问题使用APPLET播放WAV的事情,自己还真没有使用java 写过多媒体处理,在网上找了一下相关的文章,有提到JMF框架的,于是找来安装一下,没有深入的研究JMF,初步觉得,使用方便,但是同时也给运行环境增加额外的负担。
然后看到《用Java实现音频播放》这篇文章,文章没有作者信息,但是可以在天极找到原文。如有需要可以根据下边的链接找到文章。
文章对javax.sound包的结构作了深入的讲解,而且为MP3解码提供的解决方案。最后介绍了一个简单播放器的开发,因为篇幅,作者没有把完整的代码送上,我仿照作者的思路,写了个简单的播放WAV文件的代码,撇开复杂的线程,目的在展示播放WAV文件的实现代码上。绵薄的功夫而已。
源代码
import java.awt.event.ActionEvent;
import java.awt.event.ActionListener;
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;
import javax.sound.sampled.UnsupportedAudioFileException;
import javax.swing.JButton;
import javax.swing.JFileChooser;
import javax.swing.JFrame;
import javax.swing.filechooser.FileFilter;
/** */ /**
* @author Administrator
*
*/
public class WavPlayer extends JFrame ... {
/** *//**
*
*/
private AudioInputStream ais;
private String fileUrl="WindowsDing.wav";
//文件过滤器
private class MyFilter extends FileFilter...{
@Override
public boolean accept(File arg0) ...{
// TODO Auto-generated method stub
if(arg0.getName().endsWith(".wav" )|| arg0.isDirectory())
return true;
return false;
}
@Override
public String getDescription() ...{
// TODO Auto-generated method stub
return "波形文件(.wav)";
}
}
WavPlayer()...{
super();
setSize(150,150);
JButton startBut=new JButton("播放");
startBut.addActionListener(new ActionListener()...{
public void actionPerformed(ActionEvent arg0) ...{
// TODO Auto-generated method stub
JFileChooser jfc= new JFileChooser();
jfc.setFileFilter(new MyFilter());
if(jfc.showOpenDialog(null)==JFileChooser.APPROVE_OPTION)
fileUrl=jfc.getSelectedFile().getAbsolutePath();
else
return;
try ...{
ais=AudioSystem.getAudioInputStream(new File(fileUrl));
AudioFormat af=ais.getFormat();
SourceDataLine sdl=null;
DataLine.Info info=new DataLine.Info(SourceDataLine.class,af);
sdl=(SourceDataLine) AudioSystem.getLine(info);
sdl.open(af);
sdl.start();
//play
int nByte=0;
byte[] buffer=new byte[128];
while(nByte!=-1)...{
nByte=ais.read(buffer,0,128);
if(nByte>=0)...{
int oByte=sdl.write(buffer, 0, nByte);
System.out.println(oByte);
}
}
sdl.stop();
} catch (UnsupportedAudioFileException e) ...{
// TODO Auto-generated catch block
e.printStackTrace();
} catch (IOException e) ...{
// TODO Auto-generated catch block
e.printStackTrace();
} catch (LineUnavailableException e) ...{
// TODO Auto-generated catch block
e.printStackTrace();
}
}
});
this.getContentPane().add(startBut);
setVisible(true);
}
public static void main(String[] args)...{
new WavPlayer();
}
}
需要指出的
需要指出的一点是,
DataLine.Info info=new DataLine.Info(SourceDataLine.class,af);
sdl=(SourceDataLine) AudioSystem.getLine(info);
sdl.open(af);
sdl.start();
sourceDataLine在被写入前需要被打开" sdl.start();" 这点作者没有说明。