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

用Java的JMF实现一个媒体播放器,可以播放音频和视频 Java package com.webapp.common.util; 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.ItemEvent; import java.awt.event.ItemLi 阅读详情
<script type="text/javascript" src="http://pagead2.googlesyndication.com/pagead/show_ads.js"> </script> 一、概述 首先我们来看看构造这个媒体播放器要达到什么样的目标,确定了目标也就确定了代码量和程序的复杂程度。本文的媒体播放器要达到如下目标: 媒体播放器是一个菜单驱动的简单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”,显示“文件”菜单,显示彩色背景的“欢迎”信息。图一显示了程序刚启动时的主窗口。 “文件”菜单包含三个菜单项。“打开”菜单显示一个对话框,用来选择媒体文件的位置。“循环”菜单决定媒体文件只播放一次(默认)还是反复播放(当菜单被选中)。最后,“退出”菜单关闭程序。另外,点击主窗口右上角的关闭按钮也可以关闭程序。请参见图二。 点击“文件/打开”菜单时,“打开媒体文件”对话框出现。选中媒体文件之后,点击“打开”按钮即可打开媒体文件;点击“取消”按钮中止文件打开操作。如图三所示。 除了上面提到的部件之外,媒体播放器还包含一个视觉部件、一个控制面板部件。视觉部件顺序播放媒体文件包含的各帧图像;控制面板部件允许用户暂停、开始媒体文件的回放,或进行其他控制操作,例如查看媒体文件信息。 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。如果出现编译错误,请检查以下各项: 源代码输入是否正确无误。 CLASSPATH设置是否正确。CLASSPATH应当包含JMF的sound.jar、jmf.jar。 接下来就可以执行“java MediaPlayer”命令启动媒体播放器。图一显示了媒体播放器刚启动之后的界面,图四是正在播放媒体的界面。 图四:用媒体播放器回放MPG电影
利用Visual C#开发一个媒体播放器 摘要:了解如何在 Microsoft Visual C# .NET 中使用 DirectShow 控件,如何开发一个媒体播放器。按照本文介绍的操作步骤,您可以创建一个简单 Visual C# 应用程序,用来播放数字音频和视频。    简介  Microsoft Visual C# 是世界上最流行的编程语言,利用 Visual C# 的最新版本 Visual C# .NET, 阅读详情

相关推荐

jmf播放视频视频,录制视频

jmf播放视频视频,录制视频

java多媒体编程(转载)

桌面PC的性能日益提高,Java虚拟机的优化技术也不断获得突破,这一切使得用Java处理实时信号成为可能。本文将通过设计和构造一个支持实时MP3、WAV和Ogg音频格式解码/回放的Java音乐播放器,阐述用JavaSound API编写音频处理程序的思路和一般过程。   JavaSound是一个小巧的低层API,支持数字音频和MIDI数据的记录/回放。在JDK 1.3

dependmyself的专栏 533

STM32F103C8T6用官方bootloader实现IAP升级操作方法

在使用STM32F103C8T6单片机IAP功能时,可以自己写bootloader程序,也可以使用官方bootloader文件。下面说一下使用官方bootloader的使用方法。 首先下载官方bootloader文件 目前使用的是这个版本,打开文件夹,选择适合自己编译器的工程。 目前使用的是keil,所以打开MDK-ARM文件夹 打开IAP工程 打开后根据自己的单片机型号,对工程进行简单的修...

HXYDJ的博客 1万+

通过Java调用音频文件 不需要播放器

package com.test; import java.io.ByteArrayInputStream; import java.io.DataInputStream; import java.io.File; import java.io.IOException; import java.io.InputStream; import javax.sound.sampled.Aud

xu_201205的专栏 3751

用逻辑分析仪实测EM4095:125kHz RFID耳标解码的电压与脉宽玄学

本文通过逻辑分析仪实测EM4095芯片,深入解析125kHz RFID耳标解码中的电压与脉宽关联现象。揭示了供电电压对曼彻斯特编码脉宽的影响规律,并提供了一套可落地的调试方法论,包括信号链路解析、逻辑分析仪配置技巧及系统级稳定性提升方案,帮助开发者解决解码不稳定问题。

weixin_30629653的博客 330

Zipformer在RK3588上的性能实测:比Conformer快多少?内存省多少?

本文在RK3588平台上对Zipformer和Conformer语音识别模型进行了全面的性能实测。结果显示,Zipformer在模型部署中展现出显著优势:推理速度比Conformer快约56%,峰值内存占用降低约60%,同时在AISHELL-1等测试集上保持了相当的识别准确率。这为边缘ASR应用提供了更高效、更节省资源的解决方案。

metal的博客 484

java不用插件播放媒体文件_JVIDEODEMO2 Java编写的 视频处理程序,用 仅仅写一个播放媒体文件的 似乎不过瘾,能不能 Develop 238万源代码下载- www.pudn.com...

文件名称: JVIDEODEMO2下载 收藏√ [5 4 3 2 1]开发工具: Java文件大小: 1105 KB上传时间: 2014-04-26下载次数: 0提 供 者: tjy详细说明:Java编写的Java视频处理程序,用Java仅仅写一个播放媒体文件的程序似乎不过瘾,能不能自己动手来处理媒体数据,达到“奇特”的播放效果呢?答案是可以的,而且还是比较容易的,这得归功于JMF...

weixin_36152824的博客 745

南邮-软件设计实验(C++版)

南邮软件设计 A档 一、分数统计 课题内容:   设计一个分数统计程序。包括学生信息的输入输出以及排序。通过该课题全面熟悉数组、字符串、文件的使用,掌握程序设计的基本方法及友好界面的设计。 课题要求: (1)输入某班级学生的姓名、分数; (2)对(1)的分数进行降幂排列并输出; (3)具有输入输出界面。 示例代码: #include<bits/stdc++.h> using...

Dainelcw 1万+

java不用插件播放媒体文件_java servlet不用插件上传文件:

展开全部import java.net.*;import java.io.*;import java.util.*;import javax.servlet.*;import javax.servlet.http.*;public class SaveFileServlet extends HttpServlet{FileWriter savefile;St...

weixin_28851659的博客 648

人形机器人_双足行走动力学:基于OpenSim平台的股骨模型与建模

摘要 本文系统解析了股骨模型的生物力学特性、建模方法及应用场景,并探讨了基于OpenSim平台的股骨与42块肌肉Hill-type建模的技术流程。股骨作为人体核心承重骨骼,其几何结构、力学性能及多尺度建模方法在医学仿真、假体设计和仿生机器人领域具有重要价值。OpenSim通过逆向动力学、肌肉力优化及多物理场耦合,为临床步态分析、手术规划及仿生系统开发提供量化工具。同时对比了Hill-type模型与其他肌肉模型的优劣,并展望AI驱动建模、智能材料集成等前沿方向。未来研究将聚焦个性化仿真、实时计算优化及生物-机

一枚农夫,闲来有事聊聊天,交个朋友,让沉闷的生活畅想下 1582

硬盘dma读写过程

保护模式中,pci上的硬盘dma读写方法

482

java制作媒体播放器_用Java构造自己的媒体播放器

一、概述首先我们来看看构造这个媒体播放器要达到什么样的目标,确定了目标也就确定了代码量和程序的复杂程度。本文的媒体播放器要达到如下目标:媒体播放器是一个菜单驱动的简单AWT应用。媒体播放器包含一个“文件”菜单,文件菜单包含三个菜单项:“打开”,用来打开媒体文件。“循环”,是播放一次(默认),还是重复播放。“退出”,退出程序。媒体播放器可以在多种平台上运行。媒体播放器的核心功能通过JMF(Java ...

weixin_35830270的博客 646

CKA-CN考试之路----15

这题和前面的那题类似.他让kube-scheduler必须满足4个CPU,我们刚才也看了,单个节点只有2个CPU。编辑/etc/kubernetes/manifests/kube-scheduler.yaml看下。根据报错信息来看 https://11.0.1.111:6443/api?查看etcd状态,是正常的.并且对本机的2379和11.0.1.111的2379监听。这里我们改成了剩余可用的10%,保存退出后可以看到。第一次退出root用户,第二次退回到初始节点。

Q先生 214

java编写的媒体播放器_BlogJava: 用Java构造自己的媒体播放器

一、概述首先我们来看看构造这个媒体播放器要达到什么样的目标,确定了目标也就确定了代码量和程序的复杂程度。本文的媒体播放器要达到如下目标:媒体播放器是一个菜单驱动的简单AWT应用。媒体播放器包含一个“文件”菜单,文件菜单包含三个菜单项:“打开”,用来打开媒体文件。“循环”,是播放一次(默认),还是重复播放。“退出”,退出程序。媒体播放器可以在多种平台上运行。媒体播放器的核心功能通过JMF(Java ...

weixin_39779032的博客 545

R语言机器学习算法实战系列(十三)随机森林生存分析构建预后模型 (Random Survival Forest)

本教程运用随机森林生存分析筛选与患者生存状态显著相关特征。该方法借随机森林这一强大机器学习算法,构建多棵决策树并集成结果,以提高生存分析准确性,识别关键生物标志物。接着,利用选定特征构建风险得分,将多个特征转化为单一数值,量化患者风险水平。之后,依据风险得分将患者分为高、低风险亚型,为临床治疗提供个性化指导。最后,通过分析时间依赖的 ROC 曲线评估模型长期预测能力。此曲线计算不同阈值下的真正例率与假正例率,在多个时间点评估,全面展现模型长期稳定性与准确性。

专注生信领域 2027

蓝牙模块HM-10手册

蓝牙模块HM-10手册,该手册对蓝牙模块HM-10进行了详细的介绍和使用方法以及一些AT指令。

小巧Java版媒体播放器

    最近软件工程做了个Java版的媒体播放器,我把代码进行了精缩了一下,嘿嘿,从上千行的代码缩成了250多行:),不过功能也少了很多哦,没有了列表,没有了文件过滤等等功能。不过麻雀虽小,五脏俱全哦,播放mp3、mpg、mpeg、avi等等音乐文件没问题哦!算是简装版啦,嘿嘿!下面是代码!package edu.whu.bbflyerwww.mymusic;import java.awt

bbflyerwww的专栏 4264

温度PID控制PLC程序

温度PID稳定控制程序,适用于欧姆龙PLC,对其他PLC也具有很大参考价值

Microsoft Visual C# .NET 中使用 DirectShow 控件,如何开发一个媒体播放器

摘要:了解如何在 Microsoft Visual C# .NET 中使用 DirectShow 控件,如何开发一个媒体播放器。按照本文介绍的操作步骤,您可以创建一个简单 Visual C# 应用程序,用来播放数字音频和视频。    简介  Microsoft Visual C# 是世界上最流行的编程语言,利用 Visual C# 的最新版本 Visual C# .NET,您能够快速、有效地开发基

2597

jre9下载 jdk9

(Java SE Runtime Environment 9.0) 9.0u175 官方最新版 【x86|x64】

计算机二级c#考试备考,利用VisualC#开发一个媒体播放器

简介Microsoft Visual C# 是世界上最流行的编程语言,利用 Visual C# 的最新版本 Visual C# .NET,您能够快速、有效地开发基于 Windows 窗体的应用程序,还可以为嵌入了 Microsoft Windows Media? Player 9 Series ActiveX 控件的应用程序添加新鲜、有趣而又非常实用的功能。DirectShow 控件是一个标准的 ...

weixin_39979215的博客 583

c#开发的媒体播放器

2019独角兽企业重金招聘Python工程师标准>>> ...

weixin_34239592的博客 233
上一篇: 简繁通
下一篇: 透视应用服务器
java169
博客等级 码龄19年 27粉丝 2568原创
评论 1
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

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

抵扣说明:

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

余额充值