放音乐的api网上查有很多,比如灶穗拆javax.sound.midi.*;
创新互联科技有限公司专业互联网基础服务商,为您提供四川服务器托管,高防物理服务器租用,成都IDC机房托管,成都主机托管等互联网服务。
支持midi,mid背景音乐的播放
public class Music implements MetaEventListener, Runnable{
private Sequence sequence = null;
private Sequencer sequencer;
private boolean isPlaying = false;
private volatile Thread thread;
public Music(){
}
public Music(String midifile){
try {
loadMidi(midifile);
} catch (IOException e) {
//族消 TODO Auto-generated catch block
e.printStackTrace();
} catch (InvalidMidiDataException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
}
//导入midi文件到内存中传给Sequence对象,相当与编码器
public void loadMidi(String filename) throws IOException, InvalidMidiDataException{
sequence = MidiSystem.getSequence(this.getClass().getResourceAsStream(filename));
}
//隐枣播放方法
public void play(){
if(isPlaying){
return;
}
try {
sequencer = MidiSystem.getSequencer();
sequencer.open();
//用Sequencer对象把声音文件序列解码出来播放
sequencer.setSequence(sequence);
sequencer.addMetaEventListener(this);
//设置循环次数,-1表示一直循环
sequencer.setLoopCount(-1);
sequencer.setLoopStartPoint(0);
sequencer.setLoopEndPoint(sequencer.getTickLength());
} catch (MidiUnavailableException e) {
// TODO Auto-generated catch block
e.printStackTrace();
} catch (InvalidMidiDataException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
if(thread == null){
thread = new Thread(this);
thread.start();
}
}
public void stop(){
if(isPlaying){
sequencer.stop();
isPlaying = false;
}
if(thread != null){
thread = null;
}
}
public void meta(MetaMessage meta) {
if(meta.getType() == 47){
System.out.println("Sequencer is done playing");
}
// TODO Auto-generated method stub
}
public void run() {
// TODO Auto-generated method stub
Thread current = Thread.currentThread();
while(current == thread !isPlaying){
sequencer.start();
isPlaying = true;
try {
thread.sleep(1001);
} catch (InterruptedException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
}
}
//用起来也很方便
public static void main(String[] args){
Music music = new Music("a.mid");
music.play();
}
}
如果这样写路径类要和音频文件放在一个目录下,如果你不想这样,有两种方法,一种是修改路径字符串,另一种是把Class.getResourceAsStream方法改成new FileInputStream 这两个方法加载资源的初始路径不同,前者找class文件所在目录,后者找project目录
import javax.sound.sampled.*;
import java.io.*;
/**
* @author Hardneedl
*/
class WavReader {
public static void main(String[] args) throws IOException, UnsupportedAudioFileException {
FileInputStream fin = new FileInputStream(args[0]);
AudioInputStream ain = AudioSystem.getAudioInputStream(fin);
AudioFormat format=ain.getFormat();
}
}
你使用了过时的类调用了过时的方法. 已经不被推荐使用, 所以eclipse会划线提示.
以toURL() 为例 直接从File对象获得链接, 但是toURL方法,不会对特殊字符编码. 但是toURI方法会进行编码
所以现在一般的解决方弯橡案是 file.toURI().toURL();
解决办法:使用javafx.scene.media.AudioClip , 该类功能简单: 播放和停止声音 . 没有暂停, 时间长度,资料,均衡器等功能
参考代码
import java.io.File;
import javafx.scene.media.AudioClip; // 导包
public class TestAudioClip {
public static void main(String[] args) throws Exception {//抛出异常
AudioClip audioClip=new AudioClip(new File("D:\\宣传片音效.mp3").toURI().toURL().toString());
audioClip.play(0.8);//设置以80%的音量播放
// 设置一个循环,保证播放完悄闹庆了声音才退出程序
while(true) {
if(!audioClip.isPlaying()) {//如果停止了播放,就退出while循启握环
break;
}
}
//while(audioClip.isPlaying()) {} //这样写更简洁
}
}