使用JMF实现一个媒体播放器,它可以是一个多媒体文件(mpeg、MP3格式)

本文介绍了一个基于Java多媒体框架(JMF)的简单音频/视频播放器实现。该播放器能够加载本地媒体文件,并提供了基本的播放控制功能,如循环播放等。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

package player;
import javax.media.*;
import javax.swing.*;
import java.awt.*;
import java.awt.event.*;

public class MediaPlay extends Frame implements ActionListener, ControllerListener, ItemListener{
Player player; //JMF播放器
Component vedio_Component; //播放器的视频组件
Component control_Component; //播放器的控制组件
boolean first = true; //标志是否是第一次打开播放器
boolean loop_flag = false; //标志是否需要循环
String currentDirectory; //文件当前目录
FileDialog fileDialog;

public MediaPlay(String title){ //构造方法
super(title);
addWindowListener(new WindowAdapter(){
public void windowClosing(WindowEvent e){ //用户单机窗口系统菜单的关闭按钮
dispose(); //调用dispose以执行windowClosed
}
public void windowClosed(WindowEvent e){
if(player != null){
player.close(); //关闭JMF播放器
}
System.exit(0);
} //创建播放器的菜单
});
Menu menu= new Menu("文件");
MenuItem open_Item = new MenuItem("文件选择") ;
open_Item.addActionListener(this);
menu.add(open_Item);
open_Item.setActionCommand("open");
menu.addSeparator();
CheckboxMenuItem loop_Item = new CheckboxMenuItem("循环播放");

loop_Item.addItemListener(this);
loop_Item.setActionCommand("loop");
menu.add(loop_Item);
menu.addSeparator();
MenuItem exit_Item = new MenuItem("推出播放器");
exit_Item.addActionListener(this);
exit_Item.setActionCommand("exit");
menu.add(exit_Item);
MenuBar menuBar = new MenuBar();
menuBar.add(menu);
this.setMenuBar(menuBar);
this.setSize(300, 250);
this.setVisible(true);
}
public void actionPerformed(ActionEvent e){
this.setSize(300, 250);
if(e.getActionCommand().equals("exit")){
dispose();
}else{
fileDialog = new FileDialog(this, "打开媒体文件", FileDialog.LOAD);
fileDialog.setDirectory(currentDirectory);
fileDialog.setVisible(true);
if(fileDialog.getFile() == null){
return;
}
currentDirectory = fileDialog.getDirectory();
if(player != null){
player.close();
}
try{
player = Manager.createPlayer(new MediaLocator("file:" + fileDialog.getDirectory() + fileDialog.getFile()));
}catch(java.io.IOException e2){
System.out.println("播放文件错误");
return;
}catch(NoPlayerException e2){
System.out.println( "不能找到播放器");
return;
}
if(player == null){
System.out.println("无法创建播放器");
return;
}
first = false;
this.setTitle(fileDialog.getFile());
player.addControllerListener(this);
player.prefetch();
}
}
public void controllerUpdate(ControllerEvent e){
this.setSize(300, 250);

if(e instanceof ControllerClosedEvent){
if(vedio_Component != null){
remove(vedio_Component);
this.vedio_Component = null;
}
if(control_Component != null){
remove(control_Component);
this.control_Component = null;
}
return;
}
if(e instanceof EndOfMediaEvent){
if(loop_flag){

player.setMediaTime(new Time(0));
player.start();
}
return;
}
if(e instanceof PrefetchCompleteEvent){
player.start();
return;
}
if(e instanceof RealizeCompleteEvent){
vedio_Component = player.getVisualComponent();
if(vedio_Component != null){
add(vedio_Component);
}
control_Component = player.getControlPanelComponent();
if(control_Component != null){
add(control_Component, BorderLayout.SOUTH);
}
this.pack();
}
}
public void itemStateChanged(ItemEvent e){
loop_flag = !loop_flag;
}
public void paint(Graphics g){
int w = getSize().width;
int h = getSize().height;
g.setColor(Color.black);
g.fillRect(0, 0, w, h);
if(first){
Font f = new Font("DialogInput", Font.BOLD, 14);
g.setFont(f);
FontMetrics fm = g.getFontMetrics();
int swidth = fm.stringWidth("*** 欢迎使用JMF多媒体播放器2 ***");
g.setColor(Color.yellow);
g.drawString("*** 欢迎使用JMF多媒体播放器2 ***", (w - swidth) / 2, (h + getInsets().top) / 2);
} else {
String s = fileDialog.getFile();
Font f = new Font("DialogInput", Font.BOLD, 16);
g.setFont(f);
FontMetrics fm = g.getFontMetrics();
int swidth = fm.stringWidth("您现在欣赏的曲目是: " + s);
g.setColor(Color.pink);
g.drawString("您现在欣赏的曲目是: " + s, (w - swidth) / 2, (h + getInsets().top) / 2);
}
super.paint(g);
}
public void updata(Graphics g){
paint(g);
}
public static void main(String[] args)
{
new MediaPlay("JMF 多媒体播放器");
}
}
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值