基于JMF 媒体文件播放

import javax.media.*;
import java.awt.*;
import java.awt.event.*;

//为MediaPlayer对象分配内存
class MediaPlayer extends Frame implements ActionListener,
ControllerListener, ItemListener {
Player player;
Component vc, cc;
boolean first = true, loop = false;
String currentDirectory;


MediaPlayer(String title) {
super(title); //设置窗口的标题
addWindowListener
(new WindowAdapter() {
//注册窗口监听事件,已处理窗口关闭事件
public void windowClosing(WindowEvent e) {
// 用户点击窗口系统菜单的关闭按钮
// 调用dispose以执行windowClosed
dispose();
}

public void windowClosed(WindowEvent e)

{
if (player != null) {
player.close();
}
System.exit(0);
}
});

Menu m = new Menu("文件"); //创建“文件”菜单

MenuItem mi = new MenuItem("打开"); //创建“打开”菜单

//把MediaPlayer对象注册成为“打开”菜单项动作事件的监听器
mi.addActionListener(this);
m.add(mi); //把“打开”菜单加入到“文件”菜单
m.addSeparator(); //在“文件”菜单中加入一条水平分割线
//创建带检查框的“循环”菜单项
CheckboxMenuItem cbmi = new CheckboxMenuItem("循环", false);
cbmi.addItemListener(this); //把MediaPlayer对象注册为循环菜单事件的监听器
m.add(cbmi); //把“循环”菜单 项加入“文件菜单”
m.addSeparator(); //分割线
mi = new MenuItem("退出");
mi.addActionListener(this);
m.add(mi);

//创建一个菜单条
MenuBar mb = new MenuBar();
mb.add(m); //把“文件”菜单加入到菜单条
setMenuBar(mb); //把信建的菜单菜单条设置为窗口的菜单条

setSize(200, 200); //窗口的大小
setVisible(true); //显示主窗口
}


//动作监听器
//当初现动作时
public void actionPerformed(ActionEvent e) {
if (e.getActionCommand().equals("退出")) { //如果动作事件起源于“退出”菜单项
// 调用dispose以便执行windowClosed
dispose(); //触发一个给窗口监听的窗口关闭事件
return; //返回
}

//创建一个“打开媒体文件”对话框
FileDialog fd = new FileDialog(this, "打开媒体文件",
FileDialog.LOAD);
//把对话框的当前目录设置为上次关闭时的目录
fd.setDirectory(currentDirectory);
fd.show(); //显示对话框,这个对话框是一个模式对话框
// 如果用户放弃选择文件,则返回
if (fd.getFile() == null) {
return;
}

//保存用户在对话框中选择媒体文件
currentDirectory = fd.getDirectory();
//如果以前已经创建 JMF 播放器对象则关闭对象
if (player != null) {
player.close();
}

try {
//根据指定的目录和名字,创建一个file:协议的媒体定位器(MediaLocator)对象
//利用该对象创建一个假冒JMF 播放器
player = Manager.createPlayer(new MediaLocator("file:" +
fd.getDirectory()
+ fd.getFile()));
} catch (java.io.IOException e2) {
System.out.println(e2);
return;
} catch (NoPlayerException e2) {
System.out.println("不能找到播放器.");
return;
}

if (player == null) {
System.out.println("无法创建播放器.");
return;
}
first = false;
//把主窗口的标题设置为媒体文件的名字
setTitle(fd.getFile());
//把MediaPlayer对象注册为来自 JMF 播放器对象的控制器事件的监听器
player.addControllerListener(this);
//让JMF播放器对象预先提取媒体内容
player.prefetch();

//此处好像缺 return
return;
}


//控制监听事器
public void controllerUpdate(ControllerEvent e) {
//当控制器被关闭
// 调用player.close()时ControllerClosedEvent事件出现。
// 如果存在视觉部件,则该部件应该拆除(为一致起见,
// 我们对控制面板部件也执行同样的操作)
if (e instanceof ControllerClosedEvent) {
if (vc != null) {
remove(vc);
vc = null;
}
if (cc != null) {
remove(cc);
cc = null;
}
return;
}

//当媒体回放结束
if (e instanceof EndOfMediaEvent) {
//如果“循环”菜单被选中
if (loop) {
//复位开始时间
player.setMediaTime(new Time(0));
player.start(); //让JMF播放器对象开始播放媒体
}
return;
}

//当预提取媒体内容结束
if (e instanceof PrefetchCompleteEvent) {
player.start(); //JMF播放器对象开始播放媒体
return;
}

//当实例化(realize)完成
if (e instanceof RealizeCompleteEvent) {
//获取JMF播放器对象的控制面板部件
vc = player.getVisualComponent();
//如果控制部件存在,则把它加入到MedaPlayer容器的南方
if (vc != null) {
add(vc);
}
cc = player.getControlPanelComponent();
if (cc != null) {
add(cc, BorderLayout.SOUTH);
}
pack(); //执行pack()操作

//此处好像缺 return
return;
}
}

//菜单项监听器
//当菜单项状态改变
public void itemStateChanged(ItemEvent e) {
loop = !loop; //切换“循环”菜单被选中的状态

//此处好像缺 return
return;
}

//绘画事件监听器
//paint() 方法
public void paint(Graphics g) {
//如果尚未装入媒体文件
if (first) {
//获得主窗口的宽度和高度
int w = getSize().width;
int h = getSize().height;
g.setColor(Color.blue); //用蓝色填充窗口内的区域
g.fillRect(0, 0, w, h);
//创建一种字体(DialogInput/粗体),并将它设置为主窗口的字体
Font f = new Font("DialogInput", Font.BOLD, 16);
g.setFont(f);
FontMetrics fm = g.getFontMetrics();
int swidth = fm.stringWidth("*** 欢迎 ***"); //计算机欢迎信息以象素计的宽度
g.setColor(Color.white); //把绘图颜色改成白色
g.drawString("*** 欢迎 ***",
(w - swidth) / 2,
(h + getInsets().top) / 2); //把主窗口的中央显示欢迎信息
}

// 调用超类Frame的paint()方法,该paint()方法将调用Frame包含的各个容器
// 和部件(包括控制面板部件)的paint()方法。
super.paint(g);

//此处好像缺 return
return;
}


// 不执行背景清除操作,以免控制面板部件闪烁
public void update(Graphics g) {
paint(g);

//此处好像缺 return
return;
}

//窗口监听器

public void windowClosing(WindowEvent e) {
if (player != null) {
player.close();
}
}


public static void main(String[] args) {
//调用MediaPlayer的构造函数,创建住窗口(同时,隐含的创建/启动AWT后台线程)
new MediaPlayer("媒体播放器1.0");
}
}


//要用到的jmf.jar 包
//或者在本地安装 JMF-2_~1.EXE
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值