使用javax.sound实现简单音频播放
本文实例为大家分享了javax.sound实现简单音频播放的具体代码,供大家参考,具体内容如下
/**
*@see
*@authorAl_assadyulinying_1994@outlook.com
*@date2016年11月17日下午6:27:59
*@versionV1.0
*Description:简易音频播放器(只支持AU,RA,WAV)
*在不使用JMF的情况下快速实现音频播放
*
*/
importjavax.sound.sampled.*;
importjava.io.*;
publicclassMusicPlayer{
privateStringmusicPath;//音频文件
privatevolatilebooleanrun=true;//记录音频是否播放
privateThreadmainThread;//播放音频的任务线程
privateAudioInputStreamaudioStream;
privateAudioFormataudioFormat;
privateSourceDataLinesourceDataLine;
publicMusicPlayer(StringmusicPath){
this.musicPath=musicPath;
prefetch();
}
//数据准备
privatevoidprefetch(){
try{
//获取音频输入流
audioStream=AudioSystem.getAudioInputStream(newFile(musicPath));
//获取音频的编码对象
audioFormat=audioStream.getFormat();
//包装音频信息
DataLine.InfodataLineInfo=newDataLine.Info(SourceDataLine.class,
audioFormat,AudioSystem.NOT_SPECIFIED);
//使用包装音频信息后的Info类创建源数据行,充当混频器的源
sourceDataLine=(SourceDataLine)AudioSystem.getLine(dataLineInfo);
sourceDataLine.open(audioFormat);
sourceDataLine.start();
}catch(UnsupportedAudioFileExceptionex){
ex.printStackTrace();
}catch(LineUnavailableExceptionex){
ex.printStackTrace();
}catch(IOExceptionex){
ex.printStackTrace();
}
}
//析构函数:关闭音频读取流和数据行
protectedvoidfinalize()throwsThrowable{
super.finalize();
sourceDataLine.drain();
sourceDataLine.close();
audioStream.close();
}
//播放音频:通过loop参数设置是否循环播放
privatevoidplayMusic(booleanloop)throwsInterruptedException{
try{
if(loop){
while(true){
playMusic();
}
}else{
playMusic();
//清空数据行并关闭
sourceDataLine.drain();
sourceDataLine.close();
audioStream.close();
}
}catch(IOExceptionex){
ex.printStackTrace();
}
}
privatevoidplayMusic(){
try{
synchronized(this){
run=true;
}
//通过数据行读取音频数据流,发送到混音器;
//数据流传输过程:AudioInputStream->SourceDataLine;
audioStream=AudioSystem.getAudioInputStream(newFile(musicPath));
intcount;
bytetempBuff[]=newbyte[1024];
while((count=audioStream.read(tempBuff,0,tempBuff.length))!=-1){
synchronized(this){
while(!run)
wait();
}
sourceDataLine.write(tempBuff,0,count);
}
}catch(UnsupportedAudioFileExceptionex){
ex.printStackTrace();
}catch(IOExceptionex){
ex.printStackTrace();
}catch(InterruptedExceptionex){
ex.printStackTrace();
}
}
//暂停播放音频
privatevoidstopMusic(){
synchronized(this){
run=false;
notifyAll();
}
}
//继续播放音乐
privatevoidcontinueMusic(){
synchronized(this){
run=true;
notifyAll();
}
}
//外部调用控制方法:生成音频主线程;
publicvoidstart(booleanloop){
mainThread=newThread(newRunnable(){
publicvoidrun(){
try{
playMusic(loop);
}catch(InterruptedExceptione){
e.printStackTrace();
}
}
});
mainThread.start();
}
//外部调用控制方法:暂停音频线程
publicvoidstop(){
newThread(newRunnable(){
publicvoidrun(){
stopMusic();
}
}).start();
}
//外部调用控制方法:继续音频线程
publicvoidcontinues(){
newThread(newRunnable(){
publicvoidrun(){
continueMusic();
}
}).start();
}
//Test
publicstaticvoidmain(String[]args)throwsInterruptedException{
MusicPlayerplayer=newMusicPlayer("bgm/1.wav");//创建音乐播放器
player.start(true);//以开始以循环的形式播放,player(false)为不循环播放
TimeUnit.SECONDS.sleep(5);
player.stop();//暂停播放音频
TimeUnit.SECONDS.sleep(4);
player.continues();//继续开始播放音频
}
}
以上就是本文的全部内容,希望对大家的学习有所帮助,也希望大家多多支持毛票票。