学院首页 软件应用 编程开发 创意设计 认证培训 软件论坛
ASP ASP.NET PHP JSP SQL MYSQL Java VB

您的位置:学院 >> 编程开发 >> Java >> 用Java构造自己的媒体播放器


用Java构造自己的媒体播放器




  一、概述

  首先我们来看看构造这个媒体播放器要达到什么样的目标,确定了目标也就确定了代码量和程序的复杂程度。本文的媒体播放器要达到如下目标:

  媒体播放器是一个菜单驱动的简单AWT应用。

  媒体播放器包含一个“文件”菜单,文件菜单包含三个菜单项:

  “打开”,用来打开媒体文件。

  “循环”,是播放一次(默认),还是重复播放。

  “退出”,退出程序。

  媒体播放器可以在多种平台上运行。

  媒体播放器的核心功能通过JMF(Java Media Framework)API实现。JMF扩展了J2SE平台的多媒体能力,允许Java应用和Applet截取、回放、转换包括音频和视频在内的多种媒体。JMF支持多种媒体格式,具体请参见Supported Media Formats and Capture Devices。

  二、初步设计

  我们把这个媒体播放器的设计分成两个部分:GUI设计,伪代码设计。在GUI设计中,我们要了解构成程序的各个GUI部件。在伪代码设计中,我们用自然语言写出程序运行原理。

  2.1 GUI设计

  媒体播放器的用户界面包含一个主窗口、一个菜单和一个打开文件的对话框。首先我们来看看主窗口的设计。主窗口应该把窗口标题显示为“媒体播放器1.0”,显示“文件”菜单,显示彩色背景的“欢迎”信息。图一显示了程序刚启动时的主窗口。


图一:媒体播放器的主窗口

  “文件”菜单包含三个菜单项。“打开”菜单显示一个对话框,用来选择媒体文件的位置。“循环”菜单决定媒体文件只播放一次(默认)还是反复播放(当菜单被选中)。最后,“退出”菜单关闭程序。另外,点击主窗口右上角的关闭按钮也可以关闭程序。请参见图二。


图二:“文件”菜单

  点击“文件/打开”菜单时,“打开媒体文件”对话框出现。选中媒体文件之后,点击“打开”按钮即可打开媒体文件;点击“取消”按钮中止文件打开操作。如图三所示。


图三:“打开媒体文件”对话框

  除了上面提到的部件之外,媒体播放器还包含一个视觉部件、一个控制面板部件。视觉部件顺序播放媒体文件包含的各帧图像;控制面板部件允许用户暂停、开始媒体文件的回放,或进行其他控制操作,例如查看媒体文件信息。


作者:sady出处:论坛责任编辑: 方舟 [ 2003-07-11 11:05 ]
一步一步构建自己的Java媒体播放器

  2.2 伪代码设计

  前面我们了解了构成媒体播放器GUI的各个部件,下面要开始“设想”一下这个程序的具体构造。在正式编写代码之前,我们先用伪代码的形式写出这个程序的运行过程,以后正式编写代码时只需把伪代码翻译成Java代码即可。下面给出了媒体播放器的伪代码描述:

  应用的类名称:MediaPlayer

  超类:Frame

  监听器分类:动作事件,控制器事件,菜单项事件,绘图事件,窗口事件

  main:

   * 为MediaPlayer对象分配内存。调用MediaPlayer构造函数,

  创建主窗口(同时,隐含地创建/启动了AWT后台线程)

   * 结束主程序线程。此时AWT线程继续运行。

  MediaPlayer构造函数:

   * 设置主窗口的标题

   * 注册窗口监听器,以处理窗口关闭事件

   * 创建“文件”菜单

   * 创建“打开”菜单项

   * 把MediaPlayer对象注册成为“打开”菜单项动作事件的监听器

   * 把“打开”菜单项加入“文件”菜单。

   * 在“文件”菜单中加入一条水平分隔线

   * 创建带检查框的“循环”菜单项

   * 把MediaPlayer对象注册成为“循环”菜单项事件的监听器

   * 把“循环”菜单项加入“文件菜单”

   * 在“文件”菜单中加入一条水平分隔线

   * 按照创建“打开”菜单项的过程,创建“退出”菜单项

   * 创建一个菜单条(MenuBar)

   * 把“文件”菜单加入到菜单条

   * 把新创建的菜单条设置为主窗口的菜单条

   * 把主窗口的大小设置为200*200像素

   * 显示主窗口

   * 结束构造函数

  动作监听器:

  当出现动作时:

   * 如果动作事件起源于“退出”菜单项,

   * 触发一个给窗口监听器的窗口关闭事件

   * 返回

   * 创建一个“打开媒体文件”对话框

   * 把对话框的当前目录设置为上次关闭时的目录

   * 显示对话框。这个对话框是一个模式对话框

   * 如果用户没有通过对话框选择媒体文件

   * 返回

   * 保存用户在对话框中选择的目录

   * 如果以前已经创建JMF播放器对象

   * 关闭该对象

   * 根据指定的目录和名字,创建一个使用file:协议的媒体定位器(MediaLocator)对象,再利用该对象创建一个JMF播放器对象

   * 如果出现异常

   * 显示错误信息,然后返回

   * 把主窗口的标题设置为媒体文件的名字

   * 把MediaPlayer对象注册为来自JMF播放器对象的控制器事件的监听器

   * 让JMF播放器对象预先提取媒体内容

   * 返回

  控制器监听器:

  当控制器被关闭:

   * 如果JMF播放器的视觉部件存在,从MediaPlayer容器拆除视觉部件

   * 如果JMF播放器的控制面板部件存在,从MediaPlayer容器拆除控制面板部件

   * 返回

  当媒体回放结束:

   * 如果“循环”菜单被选中

   * 复位JMF播放器对象的开始时间

   * 让JMF播放器对象开始播放媒体

   * 返回

  当预提取媒体内容结束:

   * JMF播放器对象开始播放媒体

   * 返回

  当实例化(realize)完成:

   * 获取JMF播放器对象的视觉部件

   * 如果视觉部件存在,则把它加入到MediaPlayer容器的

  中间

   * 获取JMF播放器对象的控制面板部件

   * 如果控制面板部件存在,则把它加入到MedaPlayer容器的南方

   * 执行pack()操作

   * 返回

  菜单项监听器:

  当菜单项状态改变:

   * 切换“循环”菜单被选中的状态

   * 返回

  绘画事件监听器:

  paint()方法:

   * 如果尚未装入媒体文件

   * 获得主窗口的宽度和高度

   * 用蓝色填充窗口内的区域

   * 创建一种字体(DialogInput/粗体),并将它设置为主

  窗口的字体

   * 计算欢迎信息的以像素计的宽度

   * 把绘图颜色改成白色

   * 在主窗口的中央显示出欢迎信息

   * 调用Frame超类的paint()方法,确保控制面板部件正确地画出

   * 返回

  update()方法:

   * 调用paint()方法

   * 返回

  窗口监听器:

   windowClosing:

    * 调用dispose以执行windowClosed

    * 返回

   windowClosed:

    * 如果已经创建JMF播放器对象

    * 关闭JMF播放器对象

    * 结束程序

  伪代码的前面三行声明了媒体播放器的类名称、超类的名称和MediaPlayer类实现的监听器。带有main:前缀的行表示MediaPlayer的main()方法。类似地,带有“构造函数:”前缀的行属于MediaPlayer的构造函数。伪代码的其余内容分成五个监听器分区:动作监听器,控制器监听器,菜单项监听器,绘图监听器,窗口监听器。每一个分区分别包含一个或多个方法。


作者:sady出处:论坛责任编辑: 方舟 [ 2003-07-11 11:05 ]
一步一步构建自己的Java媒体播放器

  三、编写代码

  下面我们把前面的伪代码转换成Java代码:

import javax.media.*;
import java.awt.*;
import java.awt.event.*;
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 ("打开");
mi.addActionListener (this);
m.add (mi);
m.addSeparator ();
CheckboxMenuItem cbmi = new CheckboxMenuItem ("循环", false);
cbmi.addItemListener (this);
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 ();
if (player != null)
player.close ();
try
{
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 ());
player.addControllerListener (this);
player.prefetch ();
}
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 ();
}
return;
}
if (e instanceof PrefetchCompleteEvent)
{
player.start ();
return;
}
if (e instanceof RealizeCompleteEvent)
{
vc = player.getVisualComponent ();
if (vc != null)
add (vc);
cc = player.getControlPanelComponent ();
if (cc != null)
add (cc, BorderLayout.SOUTH);
pack ();
}
}
public void itemStateChanged (ItemEvent e)
{
loop = !loop;
}
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);
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);
}
// 不执行背景清除操作,以免控制面板部件闪烁
public void update (Graphics g)
{
paint (g);
}
public static void main (String [] args)

{
new MediaPlayer ("媒体播放器1.0");
}

}

  上述代码的具体含义这里就不再分析。实际上,代码中的注释解释了关键步骤的作用;另外,前面的伪代码也非常接近这里的Java代码,可以看作对上述代码的详细解释。

  四、编译和运行

  假设前面的Java代码保存在MediaPlayer.java文件中,则编译命令如下:

  javac MediaPlayer.java

  编译成功后,编译器生成两个.class文件:MediaPlayer.class,MediaPlayer$1.class。如果出现编译错误,请检查以下各项:

  源代码输入是否正确无误。

  CLASSPATH设置是否正确。CLASSPATH应当包含JMF的sound.jar、jmf.jar。

  接下来就可以执行“java MediaPlayer”命令启动媒体播放器。图一显示了媒体播放器刚启动之后的界面,图四是正在播放媒体的界面。


图四:用媒体播放器回放MPG电影

 
技术文章快速查找

栏目导航
软件应用
·操作系统 ·杀毒防黑 ·应用软件
·聊天软件 ·网络软件  
Web开发
·ASP ·JavaScript ·CGI
·JSP ·VbScript ·Web服务器
·PHP ·XML  
开发语言
·VB ·VC ·ASP.NET
·Java ·C/C++ ·Delphi
数据库开发
·MySQL ·SQL/Access ·PowerBuilder
·Oracle ·DB2  
网站设计
·Flash ·Dreamweaver ·HTML/CSS
·Fireworks ·FrontPage  
平面设计
·Photoshop ·CorelDraw ·AutoCAD
·FreeHand ·Illustrator ·3DsMAX
媒体动画
·Director ·Authorware ·Maya
·视频处理    


相关软件 产品库推荐
·笔记本 ·台式机 ·服务器
·数码相机 ·手机 ·GPS
·DV摄像机 ·MP3 ·MP4
·CPU ·硬盘 ·内存
·主板 ·显卡 ·显示器
·打印机 ·投影机 ·路由器

冰之龙溪 发表于2008-4-16 16:59:49
运行不起,好多错...
游客 发表于2008-4-15 0:33:27
不错呀,就是运行不起来...
游客 发表于2008-3-21 0:08:33
对"用Java构造自己的媒体播放器"的评论 - 快速回贴
内容:
  [完成后可按Ctrl+Enter发布]

百度中 用Java构造自己的媒体播放器 相关内容
Google搜索中 用Java构造自己的媒体播放器 相关内容
雅虎中 用Java构造自己的媒体播放器 相关内容
Sogou搜索中 用Java构造自己的媒体播放器 相关内容

相关软件 最新回复帖子:

·用Java构造自己的媒体播放器
·一张图透彻讲解Photoshop蒙版
·另类方法 教你四种神奇电脑开机方法
·高性能 高弹性JSP和Servlet性能优化
·巧用AutoCAD对象选择技巧提高制图效率
·AutoCAD造型实例:十字形螺丝刀头
·利用AutoCAD拉伸面命令绘制哑铃
·在AutoCAD中快速做好等分点
·用Visual Basic实现点对点通讯
·优化数据库大幅度提高Oracle的性能


  相关软件 用Java构造自己的媒体播放器相关文章
Java Swing 组件全演示 Java平台上的CRM系统
Java游戏编程初步 在Java中轻松打印文档
用Java实现音频播放 用Java实现PDF报表
用RMI和CORBA进行分布式Java编程 使用Java API压缩和解压缩数据
正则表达式和Java编程语言 通过Java套接字传递对象
Java技术实现数据库应用系统慨述 优化JAVA性能的几种方法
Java声音技术详解 Java中finalize()的另类用法
从重构的角度学习bridge设计模式 对《Java与模式》中工厂方法模式的异议
用Socket类实现HTTP协议客户端应用 浅谈Java的输入输出流
Java对等计算实践:基于 IP 多播的发现 Servlet中如何捕获Session事件?