——MP3文件工程的建立和源代码
做完上面1的所有步骤之后,说明你已经把JMF的环境配置完毕,接下来我们就可以进行MP3的java文件的编写了。
首先我们先建立一个java Projet文件
然后在java Project文件中建立一个文件夹,但是这个文件夹不是普通的文件夹(普通文件夹只用来存放数据或文件),而是需要建立一个【Source Folder】文件夹,该文件夹可以对内部文件进行编译和处理,我们所要编写的MP3文件就需要放在该文件夹下面。
在此我特别说几个注意事项:
(1)、我们创建MediaPlayer的时候,它对应的包为:importjavax.media.bean.playerbean.MediaPlayer;但是该包不会自动的导入,所以这个包必须我们手动添加,不然会报程序错误
(2)我们需要验证一下我们导入的JMF包和环境配置是否成功,
我们发现在
已经导入和jmf.jar和sound.jar
(3)JMF没有内置的MP3播放的插件,需要根据oracle官网上的说明安装这个才能使用。
JMF并不包含对MP3文件的解码,我们要播放MP3文件,就需要一个MP3的解码器,而这个解码器我们可以下载,大小只有几十KB,我们在【百度】搜索【JMF MP3 Plugin】,如图:
我们选择第二个,点击打开如下页面:
我们点击【DownLoad】进行相关下载。
或者在:http://www.pudn.com/downloads565/sourcecode/java/detail2326572.html进行下载
JMF MP3 Plugin该插件下载后,直接把该文件放在JDK的目录下即可。
下面是源代码:
import java.awt.BorderLayout;
import java.awt.Component;
import java.awt.FileDialog;
import java.awt.event.ActionEvent;
import java.awt.event.ActionListener;
import java.awt.event.MouseEvent;
import java.awt.event.MouseListener;
import java.util.Vector;
import javax.swing.ImageIcon;
import javax.swing.JFrame;
import javax.swing.JLabel;
import javax.swing.JList;
import javax.swing.JMenu;
import javax.swing.JMenuBar;
import javax.swing.JMenuItem;
import javax.swing.JPanel;
import javax.swing.JSplitPane;
import javax.swing.SwingUtilities;
import javax.media.ControllerEvent;
import javax.media.MediaLocator;
import javax.media.RealizeCompleteEvent;
import javax.media.bean.playerbean.MediaPlayer;
public class cuiPM3 {
private static final long serialVersionUID = 1L; // 序列化,为了实现网络传输
private static MediaPlayer MyPlayer;
private static String filename = "d:\\和你一样.mp3";
private static JFrame framePlay = null;
private static JPanel panelPlay = null;
private static JPanel panelList = null;
private static JList listPlay = null;
private static Vector vectorPlay = null;
private static JMenuBar menuBar=null;
private static JSplitPane SplitPanel=null;
private static ActionListener openFile = new ActionListener() {
@Override
public void actionPerformed(ActionEvent e) {
// TODO Auto-generated method stub
FileDialog fd = new FileDialog(framePlay, "选择歌曲", FileDialog.LOAD); // 打开选择文件的选择框,提示框名为"选个歌曲",
// this代表主类
fd.setVisible(true); // 显示选择框
filename = fd.getDirectory() + fd.getFile(); // 文件名称=获取此文件对话框的目录+文件名
System.out.println(filename);
if (filename.equals("")) {
return;
} else if (filename.equals("nullnull")) {
return;
}
boolean j = false;
for (int i = 0; i < vectorPlay.size(); i++) {
if (vectorPlay.get(i).toString().equals(filename)) {// 如果数组里面的数据和文件名一样,则直接结束不添加
j = true;
break;
}
}
if (j == false) {
vectorPlay.add(filename); // 将文件名添加至动态数组里面
listPlay.setListData(vectorPlay); // 列表框的数据添加动态数组
}
}
};
private static ActionListener closeFile = new ActionListener() {
@Override
public void actionPerformed(ActionEvent e) {
// TODO Auto-generated method stub
System.exit(0);
}
};
private static ActionListener playMusic = new ActionListener() {
@Override
public void actionPerformed(ActionEvent e) {
// TODO Auto-generated method stub
play();
}
};
private static ActionListener stopMusic = new ActionListener() {
@Override
public void actionPerformed(ActionEvent e) {
// TODO Auto-generated method stub
stop();
}
};
public cuiPM3() {
initialize();// 初始状态
}
private void initialize() {
// TODO Auto-generated method stub
}
protected static void play() {
// TODO Auto-generated method stub
try {
if (filename.equals("")) {
return;
}
if (MyPlayer == null) {
MyPlayer = new MediaPlayer();
} else {
closePreviosPlayer();
}
MyPlayer.setMediaLocator(new MediaLocator("file:///" + filename)); //建立一个播放器的定位时间
//MyPlayer.addControllerListener(framePlay);
MyPlayer.realize(); //
MyPlayer.start(); // 开始播放歌曲
} catch (Exception e) {
}
}
private static void closePreviosPlayer() {
// TODO Auto-generated method stub
if (MyPlayer == null)
return;
MyPlayer.stop();
MyPlayer.deallocate(); // 停止播放并且重新装载DateSource
Component visual = MyPlayer.getVisualComponent(); /*
* player.getVisualComponent
* ()是一个播放所有视频媒体的可视组件。
*/
Component control = MyPlayer.getControlPanelComponent(); /*
* player.
* getControlPanelComponent
* (
* )是一个操作时间轴的可是组建
* ,
* 也包含了一些媒体的其他信息
* 。
*/
if (visual != null) {
panelPlay.remove(visual);
}
if (control != null) {
panelPlay.remove(control);
}
}
protected static void stop() {
// TODO Auto-generated method stub
MyPlayer.stop();
MyPlayer.deallocate();
}
/*
public synchronized void controllerUpdate(ControllerEvent event) { // Player状态控制
if (event instanceof RealizeCompleteEvent) {
Component comp;
if ((comp = MyPlayer.getControlPanelComponent()) != null) { // 操作时间轴不为空,就将其添加在面板最低端
panelPlay.add("South", comp);
} else {
closePreviosPlayer();
}
if ((comp = MyPlayer.getVisualComponent()) != null) { // 可视化面板不为空就将其添加至居中
panelPlay.add("Center", comp);
}
validate();
}
}
*/
private void validate() {
// TODO Auto-generated method stub
}
private static MouseListener mouseAction=new MouseListener() {
@Override
public void mouseClicked(MouseEvent e) {
// TODO Auto-generated method stub
if (e.getClickCount() == 1) { // getClickCount鼠标监听事件,如果鼠标单击一次
String str = (String) listPlay.getSelectedValue();
if (str == null) {
return;
}
filename = str;
//System.out.println(str);// 如果单击一次则输出在他的歌曲名称
}
if (e.getClickCount() == 2) { // 如果鼠标单击两次
String str = (String) listPlay.getSelectedValue(); // str接受鼠标选取的列表框中的值
if (str == null) {// 如果为空,怎么什么都不做,否则开始播放str接受的歌曲
return;
}
filename = str;
play();
}
}
@Override
public void mousePressed(MouseEvent e) {
// TODO Auto-generated method stub
}
@Override
public void mouseReleased(MouseEvent e) {
// TODO Auto-generated method stub
}
@Override
public void mouseEntered(MouseEvent e) {
// TODO Auto-generated method stub
}
@Override
public void mouseExited(MouseEvent e) {
// TODO Auto-generated method stub
}
};
public static void main(String[] args) {
SwingUtilities.invokeLater(new Runnable() { //个匿名内部类,runnable()是应用在多线程中的。它的实例化就默认调用了一个run()方法。
public void run() {
framePlay = new JFrame("我自己的MP3播放器");
framePlay.setBounds(200, 100, 1100, 580);
framePlay.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
framePlay.setResizable(false);// 将最大化按钮的作用取消
panelPlay = new JPanel(); // 创建一个左面的播放面板
panelList = new JPanel(); // 创建一个右面的列表面板
ImageIcon image=new ImageIcon("image/beijing.jpg");
JLabel labelImage=new JLabel(image);
panelPlay.add(labelImage,BorderLayout.WEST);
SplitPanel = new JSplitPane();// 创建一个可分割的面板,用于将面板分为一左一右两个面板
SplitPanel.setDividerSize(5); // 设置分格条的大小
SplitPanel.setResizeWeight(0.01); // 设置分割的比例
SplitPanel.setEnabled(false); //固定分割条不可左右
SplitPanel.setRightComponent(panelList); // 为分割的右面板添加播放列表面板
SplitPanel.setLeftComponent(panelPlay); // 为分割的左面板添加播放面板
listPlay = new JList(); // 定义一个列表框
listPlay.addMouseListener(mouseAction);
JLabel labelList=new JLabel("播放列表");
panelList.add(labelList,BorderLayout.NORTH);
vectorPlay = new Vector(); // 定义一个动态数组,用于接受我们添加的歌曲的列表
panelList.add(listPlay);// 将列表框添加至列表面板
menuBar = new JMenuBar(); // 定义一个空白的菜单条
JMenu menu = new JMenu("文件"); // 定义一个文件的菜单组件
JMenu menu2 = new JMenu("操作"); // 定义一个保存的菜单组件
menuBar.add(menu);
menuBar.add(menu2);
JMenuItem menuItem = new JMenuItem("打开文件··"); // 定义一个"打开文件··"的菜单项
menuItem.addActionListener(openFile);
JMenuItem menuItem2 = new JMenuItem("关闭程序 "); // 定义一个"关闭程序"的菜单项
menuItem2.addActionListener(closeFile);
JMenuItem menuItem3 = new JMenuItem("播放"); // 定义一个"播放"的菜单项
menuItem3.addActionListener(playMusic);
JMenuItem menuItem4 = new JMenuItem("停止"); // 定义一个"停止"的菜单项
menuItem4.addActionListener(stopMusic);
// 为"文件"菜单组添加"打开文件··"和"关闭程序"两个菜单项
menu.add(menuItem);
menu.add(menuItem2);
// 为"操作"菜单组添加"播放"和"停止"这两个菜单项
menu2.add(menuItem3);
menu2.add(menuItem4);
framePlay.setJMenuBar(menuBar); // 将菜单条添加至顶层容器中
framePlay.add(SplitPanel);
framePlay.setVisible(true);
}
});
}
}
效果如图所示: