第7周作业1——JMF(Java多媒体框架)的应用之MP3播放器 问题系列
2014-05-12 23:57
393 查看
(1)怎样编写Java程序,实现播放mp3音乐?——请思考并实践一下,利用baidu、google两个主要搜索引擎。写下自己搜索时关键词,比较两个搜索引擎结果差异?
答:为了支持MP3的播放,我们必须添加MP3的SPI支持库。首先需要下载MP3的支持库。
下载地址:http://www.javazoom.net/mp3spi/sources/mp3spi1.9.4.zip。
下载文件:mp3spi1.9.4.zip。
将mp3spi1.9.4.zip中的3个JAR文件jl1.0.jar 、mp3spi1.9.4.jar 、tritonus_share.jar添加到当前项目中即可。
MP3音乐播放器,实现的功能是:选择"文件"→"打开"命令弹出文件选择对话框,将选择目录的所有MP3和WAV文件加入到播放列表中,双击播放列表中的音乐文件实现音乐的播放和切换。
要实现该程序,首先需要提供了一个主程序窗口,该窗口提供了各种界面组件和操作事件的控制,并包含一个音乐播放的子线程,子线程由主线程控制。因此有以下两个类。
音乐播放器主程序MusicPlayer.java。
播放线程PlayThread.java。
(1)音乐播放器主程序MusicPlayer.java
该类继承自Frame类,首先需要为该类添加文件播放的5个变量:
并添加一个录音标志开关,控制录音的开始与停止:
同时添加几个显示界面组件:
在该程序的构造函数中,需要分别创建主窗体、菜单栏、文件列表组件、信息显示面板。并为菜单栏注册单击事件,为文件列表组件注册鼠标事件,为窗体注册关闭事件。
在菜单栏中选择"打开"选项时,执行打开函数open(),用以打开文件选择对话框,将选择目录的MP3和WAV文件添加到列表组件中。
文件列表组件在被鼠标双击时,取得被选择的文件名,并取得被选择的文件名,然后调用播放函数play()进行播放。
窗口关闭事件发生时调用System.exit(0)退出程序。
play()函数中在播放录音时,调用的是内部播放线程PlayThread.java来进行播放。该函数中首先会设置音乐的停止标志isStop=true,子线程在发现该变量为true时就会停止当前音乐的播放;由于从接收到停止指令到停止音乐的播放会需要一段时间,所以需要在play()中根据hasStop来执行一段时间的暂停,当子线程结束后该变量就会为true,此时play()函数就会继续执行,读取音乐文件,并进行MP3文件的编码,创建新的子线程对象进行播放。
音乐播放器主程序MusicPlayer.java
在该主程序中添加一个入口主函数main()来启动该主程序即可。
至于两个搜索引擎结果差异:我个人认为百度里搜索的时候会出现大量的内容而不知道哪个是真正有用的,也不知道会不会存在某些错误,在谷歌里面写入关键字搜索时它提供的内容不多,但是觉得相对百度里面的要好些。
(2)思考:这么多搜索结果,谁的答案可能更可信呢?好的答案,不仅仅是提供代码,并且还有作者的解释。——目前中国主要的Java编程网站有有哪些?通过网络搜索,写下中国10个最主要的Java编程网站/社区 网址(至少8个),并附上评价的证据。
答案:
答:为了支持MP3的播放,我们必须添加MP3的SPI支持库。首先需要下载MP3的支持库。
下载地址:http://www.javazoom.net/mp3spi/sources/mp3spi1.9.4.zip。
下载文件:mp3spi1.9.4.zip。
将mp3spi1.9.4.zip中的3个JAR文件jl1.0.jar 、mp3spi1.9.4.jar 、tritonus_share.jar添加到当前项目中即可。
MP3音乐播放器,实现的功能是:选择"文件"→"打开"命令弹出文件选择对话框,将选择目录的所有MP3和WAV文件加入到播放列表中,双击播放列表中的音乐文件实现音乐的播放和切换。
要实现该程序,首先需要提供了一个主程序窗口,该窗口提供了各种界面组件和操作事件的控制,并包含一个音乐播放的子线程,子线程由主线程控制。因此有以下两个类。
音乐播放器主程序MusicPlayer.java。
播放线程PlayThread.java。
(1)音乐播放器主程序MusicPlayer.java
该类继承自Frame类,首先需要为该类添加文件播放的5个变量:
String filepath; //播放文件目录 String filename; //播放文件名称 AudioInputStream audioInputStream; //文件流 AudioFormat audioFormat; //文件格式 SourceDataLine sourceDataLine; //输出设备
并添加一个录音标志开关,控制录音的开始与停止:
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(); } } |
至于两个搜索引擎结果差异:我个人认为百度里搜索的时候会出现大量的内容而不知道哪个是真正有用的,也不知道会不会存在某些错误,在谷歌里面写入关键字搜索时它提供的内容不多,但是觉得相对百度里面的要好些。
(2)思考:这么多搜索结果,谁的答案可能更可信呢?好的答案,不仅仅是提供代码,并且还有作者的解释。——目前中国主要的Java编程网站有有哪些?通过网络搜索,写下中国10个最主要的Java编程网站/社区 网址(至少8个),并附上评价的证据。
答案:
相关文章推荐
- 第7周作业1——JMF(Java多媒体框架)的应用之MP3播放器
- 第7周作业1——JMF(Java多媒体框架)的应用之MP3播放器(未完)
- 第7周作业4——JMF(Java多媒体框架)的应用之视频播放器
- 。第7周作业——JMF(Java多媒体框架)的应用之音频播放与视频播放
- 网络121第7周实验——JMF(Java多媒体框架)的应用(音频、视频、摄像头等)
- JAVA字符编码系列三:Java应用中的编码问题
- strust框架中java web应用的中文化问题解决
- 第三篇:JAVA字符编码系列三:Java应用中的编码问题
- JAVA字符编码系列三:Java应用中的编码问题
- JMF(Java多媒体框架)资料汇总
- JAVA字符编码系列三:Java应用中的编码问题
- JAVA字符编码系列三:Java应用中的编码问题
- 【JAVA编码专题】 JAVA字符编码系列三:Java应用中的编码问题
- JAVA字符编码系列三:Java应用中的编码问题
- 【JAVA编码专题】 JAVA字符编码系列三:Java应用中的编码问题 分类: B1_JAVA 2015-02-10 21:05 135人阅读 评论(0) 收藏
- 【JAVA编码专题】 JAVA字符编码系列三:Java应用中的编码问题
- 【JAVA编码专题】 JAVA字符编码系列三:Java应用中的编码问题
- 【JAVA编码专题】 JAVA字符编码系列三:Java应用中的编码问题
- JAVA字符编码系列三:Java应用中的编码问题
- 【JAVA编码专题】 JAVA字符编码系列三:Java应用中的编码问题