给java程序加背景音乐的代码~
Posted
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了给java程序加背景音乐的代码~相关的知识,希望对你有一定的参考价值。
学校小组做了个java游戏~求给程序加背景音乐的代码, 从网上找了很多,放进去在Eclipse上运行的时候,就光播放音乐 不出现游戏画面了 不知道为什么~
谢谢!
我的毕业设计也是做的一个小游戏程序--坦克大战,当初游戏逻辑界面都完成了想加入音频的时候也遇到了困难,最开始想到了多线程处理,也就是自身游戏的绘图线程占用着主线程,如果此时再在同一线程播放音频的话肯定会造成音频流或者绘图类paint阻塞,所以这时要为音频加入一个单独额外的线程,已达到避免线程阻塞的作用.
但是此时还是会出现音频不流畅的情况(当然,大多情况是出现短暂音效后便消失),主要问题在于Java在利用线程读取音频的时候,是通过流的方式读取的,此时可以考虑在程序加载之前先“预载”一次音频,当需要的时候再调用它的播放线程,利用流处理.这么做的好处是将音频存放在内存中,当需要的时候能正常的出现.当然,后面这段情况是在你运用到了多线程的时候才会出现的。
找了下毕设时的代码,如下:
/**
*该方法为音频流缓冲方法,在调用音频播放线程时调用
*/
public BufferedInputStream loadBomb()
BufferedInputStream bufbomb = null;
try
File dir = new File("D:/java/TankWar2.6/"); //所要播放文件的路径
File fObject = new File(dir,"bomb.wav"); //音频名
FileInputStream file = new FileInputStream(fObject);
bufbomb = new BufferedInputStream(file);
catch(IOException e)
System.out.println(e.getMessage());
return bufbomb;
/**
* 缓冲完毕的核爆音频播放线程
*/
private class BombMusic implements Runnable //通过流读取声音文件
BufferedInputStream buf;
public void run()
buf = loadBomb();
try
Audiostream audio = new AudioStream(buf);
AudioPlayer.player.start(audio);
catch(IOException e)
e.printStackTrace();
参考技术A 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.FloatControl;
import javax.sound.sampled.LineUnavailableException;
import javax.sound.sampled.SourceDataLine;
import javax.sound.sampled.UnsupportedAudioFileException;
public class AePlayWave extends Thread
private String filename;
private Position curPosition;
private final int EXTERNAL_BUFFER_SIZE = 524288; // 128Kb
enum Position
LEFT, RIGHT, NORMAL
;
public AePlayWave(String wavfile)
filename = wavfile;
curPosition = Position.NORMAL;
public AePlayWave(String wavfile, Position p)
filename = wavfile;
curPosition = p;
public void run()
File soundFile = new File(filename);
if (!soundFile.exists())
System.err.println("Wave file not found: " + filename);
return;
AudioInputStream audioInputStream = null;
try
audioInputStream = AudioSystem.getAudioInputStream(soundFile);
catch (UnsupportedAudioFileException e1)
e1.printStackTrace();
return;
catch (IOException e1)
e1.printStackTrace();
return;
AudioFormat format = audioInputStream.getFormat();
SourceDataLine auline = null;
DataLine.Info info = new DataLine.Info(SourceDataLine.class, format);
try
auline = (SourceDataLine) AudioSystem.getLine(info);
auline.open(format);
catch (LineUnavailableException e)
e.printStackTrace();
return;
catch (Exception e)
e.printStackTrace();
return;
if (auline.isControlSupported(FloatControl.Type.PAN))
FloatControl pan = (FloatControl) auline
.getControl(FloatControl.Type.PAN);
if (curPosition == Position.RIGHT)
pan.setValue(1.0f);
else if (curPosition == Position.LEFT)
pan.setValue(-1.0f);
auline.start();
int nBytesRead = 0;
byte[] abData = new byte[EXTERNAL_BUFFER_SIZE];
try
while (nBytesRead != -1)
nBytesRead = audioInputStream.read(abData, 0, abData.length);
if (nBytesRead >= 0)
auline.write(abData, 0, nBytesRead);
catch (IOException e)
e.printStackTrace();
return;
finally
auline.drain();
auline.close();
使用上面的如下:
/**
*TestWav.java
* Created on 4:22:18 PM Feb 20, 2009
*@author Quasar063501
*@version 0.1
*
*/
public class TestWav
public static void main(String args[])
AePlayWave p = new AePlayWave("src/bg.wav");
p.start();
参考技术B 这个没做过
我想是不是用主线程来播放音乐
线程一直堵塞在这, 导致其它代码无法运行到
用短的音乐, 看播放完了, 是不是界面就出来了
如果是如上猜测, 就用其它线程来播放音乐
以上是关于给java程序加背景音乐的代码~的主要内容,如果未能解决你的问题,请参考以下文章