java.awt.Toolkit tk = java.awt.Toolkit.getDefaultToolkit()
// 发出当前系统最简单的声音
tk.beep()
不需要外部包,只是用系统JDK中的 awt包下的 toolkit工具类就可以了。
AudioClip audio1=getAudioClip(codebase,"danny.au")可以写在paint函数中,也可以写在别的函数中。Java applet除了可以播放.au的音乐文件还可以播放.wav的音乐文件,要播放mp3文件需要有JMF插件。import java.applet.Applet
import java.applet.AudioClip
import java.awt.Graphics
import java.net.URL
public class PlaySound extends Applet
{
public void paint(Graphics g)
{
URL codebase=getCodeBase()
System.out.println(codebase)
AudioClip audio1=getAudioClip(codebase,"danny.au")
g.drawString("Play music",30,30)
audio1.loop()
}
}
放音乐的api网上查有很多,比如javax.sound.midi.*支持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目录
欢迎分享,转载请注明来源:内存溢出
评论列表(0条)