java怎么播放本地音乐?????????????????
解决方案 »
- 怎样调用一个外部类??
- 急救啊!!!HTTP Status 500 错误,网上查了很多还是不大明白,请大侠指点
- URL:控件!! 文本框 !!
- 我是初学者。JDK+tomcat都装好了,但我有一个例子还是无法看效果。应该怎么做?
- 覆盖方法的可访问性不能较弱.
- 如何控制表格的一列中某些单元格可编辑,某些不可编辑呢?
- java 跟 xml
- 输入类名,怎样得到这个类的一个实例? 不要返回Object的, 要调用这个类的一个方法,用反射太慢了,保证该方法存在
- 请问:谁能介绍一本JAVA网络编程方面的书?我看过欧里莱的简体中文版,很多地方看不明白。。。
- 请问从哪里可以查到java类的资料?????
- java中非阻塞的socket
- java 您的主机中的软件中止了一个已建立的连接。求解决
{
try{
// 用输入流打开一音频文件
InputStream in = new FileInputStream(Filename);//FIlename 是你加载的声音文件如(“game.wav”)
// 从输入流中创建一个AudioStream对象
AudioStream as = new AudioStream(in);
AudioPlayer.player.start(as);//用静态成员player.start播放音乐
//AudioPlayer.player.stop(as);//关闭音乐播放
//如果要实现循环播放,则用下面的三句取代上面的“AudioPlayer.player.start(as);”这句
/*AudioData data = as.getData();
ContinuousAudioDataStream gg= new ContinuousAudioDataStream (data);
AudioPlayer.player.start(gg);// Play audio.
*/
//如果要用一个 URL 做为声音流的源(source),则用下面的代码所示替换输入流来创建声音流:
/*AudioStream as = new AudioStream (url.openStream());
*/
} catch(FileNotFoundException e){
System.out.print("FileNotFoundException ");
} catch(IOException e){
System.out.print("有错误!");
}
}
那么通过runtime直接在程序中打开就行了。String file="c:\\歌曲名.mp3";
Runtime.getRuntime().exec("cmd /c start " + file.replaceAll(" ", "\" \""));
* Subclass: MusicPlay
*************************************************/
public class MusicPlay implements Runnable {
private Time zeroTime = new Time(0);
private Player player;
private boolean isloop = false; /*************************************************
* Function: MusicPlay Description: constructor, load the music file and
* get ready for play Called By: MultiMedia()
*************************************************/
// 实例化各个参数 filename 为文件名,可为绝对路径
public MusicPlay(String filename) {
File file = new File(filename);
try {
player = Manager.createRealizedPlayer(file.toURI().toURL());
player.addControllerListener(new ControllListener());
} catch (NoPlayerException e) {
e.printStackTrace();
} catch (CannotRealizeException e) {
e.printStackTrace();
} catch (MalformedURLException e) {
e.printStackTrace();
} catch (IOException e) {
e.printStackTrace();
}
} /*************************************************
* Function: isRunning Description: test if this music is playing Called
* By:
*************************************************/
public boolean isRunning() {
return player.getState() == Player.Started;
} /*************************************************
* Function: play Description: play the music for once Called By:
* resumeAll()
*************************************************/
// 只播放一次
public void play() {
if (!turnOff)
player.start();
} /*************************************************
* Function: replay Description: replay the music Called By: musics that
* will be played many times will invoke this methed
*************************************************/
// 再播放一次
public void replay() {
if (turnOff)
return; if (player.getState() == Controller.Prefetched)
player.setMediaTime(zeroTime);
player.start();
} /*************************************************
* Function: stop Description: stop this music Called By: stopAll() of
* upper class,suspendAll() of upper
* class,BackroundForMenuPanel,GameOverPanel
*************************************************/
public void stop() {
player.stop();
} /*************************************************
* Function: close Description: dispose the music Called By: closeAll()
* of super class
*************************************************/
public void close() {
player.stop();
player.close();
} /*************************************************
* Function: loop Description: make the music played repetitiously
* Called By: music that will repetitious play
*************************************************/
// 循环播放
public void loop() {
if (turnOff)
return; isloop = true;
player.prefetch();
replay();
} /*************************************************
* Function: run Description: trig this music Called By: Override method
*************************************************/
@Override
public void run() {
loop();
} /*************************************************
* Subclass: ControllListener Description: listener for playing and
* implement playing repetitiously
*************************************************/
// 通过对播放进度的监听,实现循环播放
private class ControllListener implements ControllerListener { public void controllerUpdate(ControllerEvent e) {
if (e instanceof EndOfMediaEvent) {
if (isloop) {
player.setMediaTime(new Time(0));
player.start();
}
}
}
} }
package com;
import java.io.File;
import java.io.IOException;
import java.net.MalformedURLException;import javax.media.CannotRealizeException;
import javax.media.Controller;
import javax.media.ControllerEvent;
import javax.media.ControllerListener;
import javax.media.EndOfMediaEvent;
import javax.media.Manager;
import javax.media.NoPlayerException;
import javax.media.Player;
import javax.media.Time;/*******************************************************************************
* Subclass: MusicPlay
******************************************************************************/
public class MusicPlay implements Runnable {
private Time zeroTime = new Time(0);
private Player player;
private boolean turnOff = false;
private boolean isloop = false; /***************************************************************************
* Function: MusicPlay Description: constructor, load the music file and get
* ready for play Called By: MultiMedia()
**************************************************************************/
// 实例化各个参数 filename 为文件名,可为绝对路径
public MusicPlay(String filename) {
File file = new File(filename);
try {
player = Manager.createRealizedPlayer(file.toURI().toURL());
player.addControllerListener(new ControllListener());
} catch (NoPlayerException e) {
e.printStackTrace();
} catch (CannotRealizeException e) {
e.printStackTrace();
} catch (MalformedURLException e) {
e.printStackTrace();
} catch (IOException e) {
e.printStackTrace();
}
} /***************************************************************************
* Function: isRunning Description: test if this music is playing Called By:
**************************************************************************/
public boolean isRunning() {
return player.getState() == Player.Started;
} /***************************************************************************
* Function: play Description: play the music for once Called By:
* resumeAll()
**************************************************************************/
// 只播放一次
public void play() {
if (!turnOff)
player.start();
} /***************************************************************************
* Function: replay Description: replay the music Called By: musics that
* will be played many times will invoke this methed
**************************************************************************/
// 再播放一次
public void replay() {
if (turnOff)
return; if (player.getState() == Controller.Prefetched)
player.setMediaTime(zeroTime);
player.start();
} /***************************************************************************
* Function: stop Description: stop this music Called By: stopAll() of upper
* class,suspendAll() of upper class,BackroundForMenuPanel,GameOverPanel
**************************************************************************/
public void stop() {
player.stop();
} /***************************************************************************
* Function: close Description: dispose the music Called By: closeAll() of
* super class
**************************************************************************/
public void close() {
player.stop();
player.close();
} /***************************************************************************
* Function: loop Description: make the music played repetitiously Called
* By: music that will repetitious play
**************************************************************************/
// 循环播放
public void loop() {
if (turnOff)
return; isloop = true;
player.prefetch();
replay();
} /***************************************************************************
* Function: run Description: trig this music Called By: Override method
**************************************************************************/
public void run() {
loop();
} /***************************************************************************
* Subclass: ControllListener Description: listener for playing and
* implement playing repetitiously
**************************************************************************/
// 通过对播放进度的监听,实现循环播放
private class ControllListener implements ControllerListener { public void controllerUpdate(ControllerEvent e) {
if (e instanceof EndOfMediaEvent) {
if (isloop) {
player.setMediaTime(new Time(0));
player.start();
}
}
}
}
public static void main(String[] args) {
MusicPlay mp = new MusicPlay("w.mp3");
mp.play();
}}
并添加一个录音标志开关,控制录音的开始与停止:boolean isStop = true; //控制播放线程boolean hasStop = true; //播放线程状态 同时添加几个显示界面组件:List list; //文件列表Label labelfilepath; //播放目录显示标签Label labelfilename; //播放文件显示标签 在该程序的构造函数中,需要分别创建主窗体、菜单栏、文件列表组件、信息显示面板。并为菜单栏注册单击事件,为文件列表组件注册鼠标事件,为窗体注册关闭事件。在菜单栏中选择"打开"选项时,执行打开函数open(),用以打开文件选择对话框,将选择目录的MP3和WAV文件添加到列表组件中。文件列表组件在被鼠标双击时,取得被选择的文件名,并取得被选择的文件名,然后调用播放函数play()进行播放。窗口关闭事件发生时调用System.exit(0)退出程序。play()函数中在播放录音时,调用的是内部播放线程PlayThread.java来进行播放。该函数中首先会设置音乐的停止标志isStop=true,子线程在发现该变量为true时就会停止当前音乐的播放;由于从接收到停止指令到停止音乐的播放会需要一段时间,所以需要在play()中根据hasStop来执行一段时间的暂停,当子线程结束后该变量就会为true,此时play()函数就会继续执行,读取音乐文件,并进行MP3文件的编码,创建新的子线程对象进行播放。该主程序完整的代码如下:音乐播放器主程序MusicPlayer.java
package com.test.audio;import java.io.File;import java.awt.BorderLayout;import java.awt.FileDialog;import java.awt.Frame;import java.awt.GridLayout;import java.awt.Label;import java.awt.List;import java.awt.Menu;import java.awt.MenuBar;import java.awt.MenuItem;import java.awt.MenuShortcut;import java.awt.Panel;import java.awt.event.ActionEvent;import java.awt.event.ActionListener;import java.awt.event.KeyEvent;import java.awt.event.MouseAdapter;import java.awt.event.MouseEvent;import java.awt.event.WindowAdapter;import java.awt.event.WindowEvent;import javax.sound.sampled.AudioFormat;import javax.sound.sampled.AudioInputStream;import javax.sound.sampled.AudioSystem;import javax.sound.sampled.DataLine;import javax.sound.sampled.SourceDataLine;public class MusicPlayer extends Frame {boolean isStop = true; //控制播放线程boolean hasStop = true; //播放线程状态 String filepath; //播放文件目录String filename; //播放文件名称AudioInputStream audioInputStream; //文件流AudioFormat audioFormat; //文件格式SourceDataLine sourceDataLine; //输出设备 List list;//文件列表Label labelfilepath; //播放目录显示标签Label labelfilename; //播放文件显示标签 public MusicPlayer() {//设置窗体属性setLayout(new BorderLayout());setTitle("MP3音乐播放器");setSize(350, 370); //建立菜单栏MenuBar menubar = new MenuBar();Menu menufile = new Menu("文件");MenuItem menuopen = new MenuItem("打开", new MenuShortcut(KeyEvent.VK_O));menufile.add(menuopen);menufile.addActionListener(new ActionListener() {public void actionPerformed(ActionEvent e) {open();}});menubar.add(menufile);setMenuBar(menubar); //文件列表list = new List(10);list.addMouseListener(new MouseAdapter() {public void mouseClicked(MouseEvent e) {//双击时处理if (e.getClickCount() == 2) {//播放选中的文件filename = list.getSelectedItem();play();}}});add(list, "Center"); //信息显示Panel panel = new Panel(new GridLayout(2, 1));labelfilepath = new Label("播放目录:");labelfilename = new Label("播放文件:");panel.add(labelfilepath);panel.add(labelfilename);add(panel, "North"); //注册窗体关闭事件addWindowListener(new WindowAdapter() {public void windowClosing(WindowEvent e) {System.exit(0);}});setVisible(true);} //打开private void open() {FileDialog dialog = new FileDialog(this, "Open", 0);dialog.setVisible(true);filepath = dialog.getDirectory();if (filepath != null) {labelfilepath.setText("播放目录:" + filepath); //显示文件列表list.removeAll();File filedir = new File(filepath);File[] filelist = filedir.listFiles();for (File file : filelist) {String filename = file.getName().toLowerCase();if (filename.endsWith(".mp3") || filename.endsWith(".wav")) {list.add(filename);}}}} //播放private void play() {try {isStop = true;//停止播放线程//等待播放线程停止System.out.print("开始播放:" + filename);while (!hasStop) {System.out.print(".");try {Thread.sleep(10);} catch (Exception e) {}}System.out.println("");File file = new File(filepath + filename);labelfilename.setText("播放文件:" + filename); //取得文件输入流audioInputStream = AudioSystem.getAudioInputStream(file);audioFormat = audioInputStream.getFormat();//转换MP3文件编码if (audioFormat.getEncoding() != AudioFormat.Encoding.PCM_SIGNED) {audioFormat = new AudioFormat(AudioFormat.Encoding.PCM_SIGNED,audioFormat.getSampleRate(), 16, audioFormat.getChannels(), audioFormat.getChannels() * 2,audioFormat.getSampleRate(), false);audioInputStream = AudioSystem.getAudioInputStream(audioFormat,audioInputStream);} //打开输出设备DataLine.Info dataLineInfo = new DataLine.Info(SourceDataLine.class, audioFormat,AudioSystem.NOT_SPECIFIED);sourceDataLine = (SourceDataLine) AudioSystem.getLine(dataLineInfo);sourceDataLine.open(audioFormat);sourceDataLine.start(); //创建独立线程进行播放isStop = false;Thread playThread = new Thread(new PlayThread());playThread.start();} catch (Exception e) {e.printStackTrace();}} public static void main(String args[]) {new MusicPlayer();}}在该主程序中添加一个入口主函数main()来启动该主程序即可。
2)播放线程PlayThread.java在主程序的播放函数play()中,调用了播放线程进行播放。该线程与录音机中的播放线程相似,不同的是它需要根据isStop指令来检查是否应该终止当前的播放线程。另外,该线程在播放结束后,还应该设置hasStop=true,告诉play()函数该线程已经停止了,可以继续下一首音乐的播放了。该程序的代码如下:播放线程PlayThread.java
class PlayThread extends Thread {byte tempBuffer[] = new byte[320]; public void run() {try {int cnt;hasStop = false;//读取数据到缓存数据while ((cnt = audioInputStream.read(tempBuffer, 0,tempBuffer.length)) != -1) {if (isStop)break;if (cnt > 0) {//写入缓存数据sourceDataLine.write(tempBuffer, 0, cnt);}}//Block等待临时数据被输出为空sourceDataLine.drain();sourceDataLine.close();hasStop = true;} catch (Exception e) {e.printStackTrace();System.exit(0);}}}(3)运行MP3音乐播放器完成以上代码后,即可运行主程序MusicPlayer,就会显示。