注册 登录  
 加关注
   显示下一条  |  关闭
温馨提示!由于新浪微博认证机制调整,您的新浪微博帐号绑定已过期,请重新绑定!立即重新绑定新浪微博》  |  关闭

Search的博客

不断学习中!

 
 
 

日志

 
 

java播放音乐之javax.swing.sampled包相关使用  

2013-03-18 20:13:50|  分类: Java |  标签: |举报 |字号 订阅

  下载LOFTER 我的照片书  |
package code.lxy.test;

import java.io.ByteArrayInputStream;
import java.io.DataInputStream;
import java.io.File;
import java.io.FileInputStream;
import java.io.FileNotFoundException;
import java.io.IOException;
import java.io.InputStream;

import javax.sound.sampled.AudioFormat;
import javax.sound.sampled.AudioInputStream;
import javax.sound.sampled.AudioSystem;
import javax.sound.sampled.Clip;
import javax.sound.sampled.DataLine;
import javax.sound.sampled.LineUnavailableException;
import javax.sound.sampled.SourceDataLine;
import javax.sound.sampled.UnsupportedAudioFileException;

public class SimpleSoundPlayer {

/**
* @param args
*/
private AudioFormat format;
private byte[]samples;
public SimpleSoundPlayer(String filepath)
{
try {
AudioInputStream stream=AudioSystem.getAudioInputStream(new File(filepath));
format=stream.getFormat();
samples=getSample(stream);
} catch (UnsupportedAudioFileException e) {
// TODO Auto-generated catch block
e.printStackTrace();
} catch (IOException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
}
public byte[]getSamples()
{
return samples;
}
public byte[] getSample(AudioInputStream audioStream)
{
//计算要读取的音频字节数
int length=(int) (audioStream.getFrameLength()*format.getFrameSize());
//读取整个音频流
byte[] samples=new byte[length];
DataInputStream ds=new DataInputStream(audioStream);
try {
ds.readFully(samples);
return samples;
} catch (IOException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
return null;
}
public void play(InputStream source)
{
/*
* 播放音乐主要依靠DataLine这个类的相关方法,首先我们要构造一个其子类SourceDataLine对象
*/
int bufferSize=format.getFrameSize()*Math.round(format.getFrameRate()/10);
//生成要播放的line
byte[] buffer=new byte[bufferSize];
SourceDataLine line = null;
DataLine.Info info=new DataLine.Info(SourceDataLine.class, format);
try {
//根据特定的格式来返回SourceDataLine对象
line=(SourceDataLine) AudioSystem.getLine(info);
line.open(format, bufferSize);
} catch (LineUnavailableException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
line.start();
int numByteRead=0;
while(numByteRead!=-1)
{
try {
numByteRead=source.read(buffer,0,buffer.length);
if(numByteRead!=-1)
{
line.write(buffer, 0, numByteRead);
}
} catch (IOException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
}
//清空数据行
line.drain();
System.out.println(format.toString());
//关闭line
line.close();
}
public void playLoop(InputStream inpustream)
{
try {
SourceDataLine line=AudioSystem.getSourceDataLine(format);
//定义一个合适的缓冲区,每次读取相应大小的数据,此大小本例设置为0.1s的数据量
int bufferSize=(int) (format.getFrameSize()*format.getFrameRate()/10);
byte []buffer=new byte[bufferSize];
line.open(format,bufferSize);
int count;
line.start();
//将读取到的数据填充到SourceDataline中以便于播放
while((count=inpustream.read(buffer,0,buffer.length))!=-1)
{
line.write(buffer, 0, count);
}
//清空数据行
line.drain();
//关闭数据行
line.close();
} catch (LineUnavailableException e) {
// TODO Auto-generated catch block
e.printStackTrace();
} catch (IOException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
}
/*public void soundByClip(InputStream inputstream)
{
try {
Clip clip=AudioSystem.getClip();
byte []sample=getSamples();
clip.start();
clip.open(format, sample, 0, sample.length);
clip.loop(0);
clip.drain();
clip.close();
} catch (LineUnavailableException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
}*/
public static void main(String[] args) throws FileNotFoundException {
// TODO Auto-generated method stub
/*
* 经过试验,其实并不是需要构建字节流stream,我们直接构建一个inputstream输入流,同样可以达到
* 播放音乐的效果
*/
SimpleSoundPlayer soundPlayer=new SimpleSoundPlayer("resource/BussaMove.wav");
InputStream stream=new ByteArrayInputStream(soundPlayer.getSamples());
InputStream stream2=new FileInputStream(new File("resource/BussaMove.wav"));
soundPlayer.playLoop(stream2);
// soundPlayer.soundByClip(stream2);

}

}

  评论这张
 
阅读(160)| 评论(0)
推荐 转载

历史上的今天

在LOFTER的更多文章

评论

<#--最新日志,群博日志--> <#--推荐日志--> <#--引用记录--> <#--博主推荐--> <#--随机阅读--> <#--首页推荐--> <#--历史上的今天--> <#--被推荐日志--> <#--上一篇,下一篇--> <#-- 热度 --> <#-- 网易新闻广告 --> <#--右边模块结构--> <#--评论模块结构--> <#--引用模块结构--> <#--博主发起的投票-->
 
 
 
 
 
 
 
 
 
 
 
 
 
 

页脚

网易公司版权所有 ©1997-2017