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

2016-02-19 16:26 124 1 收藏

图老师小编精心整理的用Java构造自己的媒体播放器希望大家喜欢,觉得好的亲们记得收藏起来哦!您的支持就是小编更新的动力~

【 tulaoshi.com - 编程语言 】

  一、概述

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

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

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

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

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

(本文来源于图老师网站,更多请访问http://www.tulaoshi.com/bianchengyuyan/)

  退出,退出程序。

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

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

  二、初步设计

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

  2.1 GUI设计

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

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

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

  图二:文件菜单

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

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

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

  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的构造函数。伪代码的其余内容分成五个监听器分区:动作监听器,控制器监听器,菜单项监听器,绘图监听器,窗口监听器。每一个分区分别包含一个或多个方法。

  三、编写代码

  下面我们把前面的伪代码转换成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。如果出现编译错误,请检查以下各项:

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

(本文来源于图老师网站,更多请访问http://www.tulaoshi.com/bianchengyuyan/)

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

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

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

来源:http://www.tulaoshi.com/n/20160219/1612097.html

延伸阅读
标签: 软件教程
potplayer播放器是一款韩国出品的视频播放器,这款软件的支持很多格式播放。而且还体积非常的小巧,如果我们想让他使用的效果更佳就来看看potplayer播放器常用设置是什么样的吧!小编和大家分享下potplayer播放器怎么用?和小编一起来看看呗! 第一:我们先打开这个视频播放器,看到这个界面你不喜欢的可以设置它...
   提到音乐播放器,大家很自然地会想起Winnamp,不过我一直想做一个属于自己的音乐播放器,但是我不会VB或C语言,怎么办呢?幸好,对多媒体制作大师Authorware我还是比较熟悉的,于是我就开始捉摸用Authorware来DIY一个音乐播放器,经过一番尝试,终于实现了一些基本功能,好东东不敢独享,在此与诸位一起分享。 实现功能:  ...
那好吧播放器怎么用   1、打开软件,即可看到各种类别,即今日推荐、电影、电视剧、综艺纪录、动漫、连载动画等分类 2、点击电影、电视剧、综艺记录即可看到下面的细小分类,用户根据自己喜欢的分类点击进去观看喜欢的视频即可 3、进入今日推荐,即可看到最新的推荐视频,你想看哪个直接点击进去观看即可,您也可以点...
播放器折纸视频教程 通过自己动手来制作播放器摆在桌上是一个不错的选择,制作的时候到最后可能一些步骤可能没有那么的顺利,那么就需要我们的细心了,如果我们一步步的去做,相信一定会做好的。首先就先根据视频来学一遍,看看玫瑰盒子是怎么折出来的吧。 播放器折纸步骤教程 准备材料:彩色正方形 1、沿着对边互角对折一下,在对折...
拜读了《中国电脑教育报》第12期第A29版《音乐播放器DIY》一文,使我深受启发,也萌生了制作一个播放器的想法。通过几天的研究实践,还真让我DIY了一个播放器,自我感觉不错喔!现特地“奉献”出来与朋友们共享! 1、打开Authorware 6.0,新建一个文件并保存名为“我的播放器”;按Ctrl+Shift+F打开Functions函数库,选择Category下的“...

经验教程

814

收藏

31
微博分享 QQ分享 QQ空间 手机页面 收藏网站 回到头部