




已阅读5页,还剩40页未读, 继续免费阅读
版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领
文档简介
I 基于基于 JMFJMF 的视频播放器设计和实现毕业论文的视频播放器设计和实现毕业论文 目 录 1 引言 1 1 1 项目背景 1 1 2 技术现状与发展趋势 1 1 3 论文组织结构 2 2 技术背景 3 2 1 JMF 结构 3 2 1 1定义 JMF 3 2 1 2JMF 体系结构简介 3 2 1 3时间模型 4 2 1 4管理器 5 2 1 5事件模型 5 2 1 6数据模型 6 2 1 7控制 6 2 2 PLAYER 对象 7 3 系统分析与设计 17 3 1 需求分析 17 3 1 1 功能分析 17 3 1 2软硬件环境分析 17 3 2 概要设计 17 3 2 1 初步设计 17 3 2 2GUI 设计 17 3 2 3 视频播放器原理 20 3 2 4伪代码设计 20 4 系统的实现 24 4 1 定义类的说明 24 4 2 程序代码 24 4 2 1 代码编写 24 4 2 2程序代码整体分析 32 4 2 3MediaPlayer 构造函数 33 4 2 4SetupMenu 构造程序菜单 34 4 3 系统操作演示 36 5 总结 40 致 谢 41 参考文献 42 1 1 1 引言引言 1 11 1项目背景项目背景 随着互联网和带宽的日益发展 视频播放已经不再是单纯个人行为 同时 也不仅局限在本地电脑 从 2006 年开始 网络视频发展日新月益 出现了很多 网络视频播放器 许多著名网站都提供视频文件的搜索 还有很多的视频网站 提供视频文件的免费下载 视频在互联网上的共享已经是大势所趋 在授权的 情况下 世界任何地方的任何视频进入网络可以得到迅速的共享 另一方面 使用网络下载视频文件的用户日益增加 互联网上的视频共享 是网络时代的一个非常重要的应用 拥有非常大的用户群 下载视频文件要播 放则必须使用视频播放软件 因此编制好的视频播放软件有非常实际的现实意 义 当前的视频播放器有用各种不同的语言和技术实现的 使用 JAVA 语言编写 的视频播放器有独特的优势 Java 跨平台 使得通过 JMF API 开发的多媒体应 用同其他 Java 应用一样 拥有 一次开发 到处运行 write once run anywhere 的特点 JMF 为多媒体的获取 播放 处理和传输定义了统一的体系 结构 消息处理机制和程序设计接口 提供给开发者一个可以扩展的并且跨平 台的强大的媒体工具 并完全支持 RTP RTCP 协议 因此使用 Java 语言开发视 频播放器是理所当然的 1 21 2 技术现状与发展趋势技术现状与发展趋势 Java 是由 Sun Microsystems 公司于 1995 年 5 月推出的 Java 程序设计语 言 以下简称 Java 语言 和 Java 平台的总称 Java 平台由 Java 虚拟机 Java Virtual Machine 和 Java 应用编程接口 Application Programming Interface 简称 API 构成 Java 应用编程接口为 Java 应用提供了一个独立 于操作系统的标准接口 可分为基本部分和扩展部分 在硬件或操作系统平台 上安装一个 Java 平台之后 Java 应用程序就可运行 现在 Java 平台已经嵌入 了几乎所有的操作系统 这样 Java 程序可以只编译一次 就可以在各种系统中 运行 Java 语言吸收了 Smalltalk 语言和 C 语言的优点 并增加了其它特性 2 如支持并发程序设计 网络通信 和多媒体数据控制等 Java 媒体架构 JMF 是一个令人激动的通用的 API 它允许 Java 开发者用 许多不同的方法处理媒体 该核心框架支持不同媒体 如 音频输出和视频输 出 间的时钟同步 它是一个标准的扩展框架 允许用户制作纯音频流和视频 流 Sun 以四种不同的专用版本提供 JMF 2 1 1 技术 满足专业开发人员的各 类需求 第一个是一个轻便型版本 它完全采用 Java 语言编写 适用于任何 Java 兼容系统 此外 开发人员还可选 择分别适用于 Solaris Windows 或 Linux 等操作系统的性能最优化软件包 以提高性能和能力 JMF 2 1 1 软件也是 Java Media 系列软件的一部分 Java Media 系列软件 包括 Java 3D Java 2D Java Sound 和 Java Advanced Imaging 等 API 采用 各种 Java Media API 软件开发商人员就能容易 快速地为他们已有的各种应 用程序和客户端 Java 小程序增添丰富的媒体功能 如流式视频 3D 图像和影 像处理等 就是说 各种 Java Media API 发挥了 Java 平台的固有优势 将 编 写一次 到处运行 的能力扩展到了图像 影像和数字媒体等各种应用领域 从 而大大缩减了开发时间和降低了开发成本 1 31 3 论文组织结构论文组织结构 第一部分 引言 描述项目背景 阐述了 Java 和 JMF 技术的现状和发展趋势 第二部分 技术背景 详细的介绍系统中使用的 JMF 技术 第三部分 系统设计 阐述系统设计的思想以及采用的一些方法 第四部分 系统实现 对在系统开发的相关成果和问题进行总结 并给出了 重要的相关代码 3 2 2 技术背景技术背景 2 12 1 JMFJMF 结构结构 2 1 12 1 1 定义定义 JMFJMF JMF 实际上是 Java 的一个类包 JMF 2 1 1 技术提供了先进的媒体处 理能力 从而扩展了 Java 平台的功能 这些功能包括 媒体捕获 压缩 流转 回放 以及对各种主要媒体形式和编码的支 持 如 M JPEG H 263 MP3 RTP RTSP 实时传送协议和实时流转协议 Macromedias Flash IBM 的 HotMedia 和 Beatniks 的 Rich Media Format RMF 等 JMF 2 1 1 还支持广受欢迎的媒体类型 如 Quicktime Microsofts AVI 和 MPEG 1 等 此外 JMF 2 1 1 软件中包括 了一个开放的媒体架构 可使开发人员灵活采用各种媒体回放 捕获组件 或采用他们自己的定制的内插组件 2 2 1 1 2 2 JMF 体体系系结结构构简简介介 在开发 JMF 应用程序之前要完全理解 JMF 的体系架构 接口和类 就 拿我们的家用摄像机系统作个例子 首先用摄像机拍摄内容 拍摄下来的内 容录制在 DV 带中 DV 带可以放在放像机里播放 放像机提供视频信号给电 视机 提供音频信号给音箱 这样我们就可以在电视机上看到画面 从音箱 里听到声音 JMF API 提供的也是同样的模型 JMF 提供的模型可大致分为七类 数据源 Data source 截取设备 Capture Device 播放器 Player 处理器 Processor 数据池 Data Sink 数据格式 Format 管理器 Manager 4 图 2 1 传统的多媒体数据处理设备与 JMF 的比较 JMF 高层结构正如图所示 数据源 Data Source 就像一盒磁带一样封 装了媒体数据流 而播放器 Player 提供了像 VCR 一样的机制处理和控制数 据 2 1 32 1 3 时间模型时间模型 图 2 2 JMF 时间模型 5 JMF 的时间精准到纳秒级 虽然在 Java 中其他的类也支持纳秒级的时间 但是在 JMF 中 一个时间点一般用 Time 对象来表示 支持 JMF 时间模型的类必须实现 Clock 才能追踪媒体数据流 Clock 接口 定义了基本的时间定位盒同步操作 而这些操作在表现媒体数据时是必须的 Clock 中的数据 media time 表示在媒体流中的当前的位置 流的开头是媒 体时间 0 流的最后是媒体时间的最大时间 媒体流的持续时间 Duration 是媒体数据流的从开始到结束的经历的时间 2 2 1 1 4 4 管管理理器器 通过使用管理器 Manager 这个对象 JMF 使得用户实现的新的关键接口 与已存在的类无缝对接 管理器模型使用了工厂模式 使用 JMF 来完成程序时 我们需要使用 Manager 的 create 方法来构造 Player Processors DataSink DataSource 来为你的应用程序服务 例如如 果你式通过一个输入设备捕获媒体数据 你将会使用 CapturtDeviceManager 来 找出哪些设备是可用的 并且通过这些对象来获取相关信息 2 2 1 1 5 5 事事件件模模型型 图 2 3 JMF 事件模型 JMF 使用一个结构化的事件报告机制来使得应用程序来与当前的媒体的状 态来保持通信 同时它还使得基于 JMF 的程序能够响应媒体驱动的错误状况 比如说资源部可获得这种情况 当 JMF 对象需要报告当前的情况时 它会抛出 MediaEvent MediaEvent 由许多特定类型的事件 对于每一个可以抛出 MediaEvent 的对象 JMF 定义了相应的监听者对象 6 2 1 62 1 6 数据模型数据模型 图 2 4 JMF 数据模型 JMF 媒体播放器经常使用 DataSource 来管理媒体内容的转移 DataSource 封装了媒体位置 使用的协议等信息 这些信息式用来传输媒体的 DataSource 是通过 JMF 中的 MediaLocator 或者 URL 来指明的 MediaLocator 与 URL 相似并且能通过一个 URL 构造 但是它与 URL 的区别是即使在相应的协 议处理没被安装的情况下它也能被构造 而 URL 不行 2 12 1 7 7 控制控制 7 图 2 6 JMF 控制 JMF 控制提供了一种机制来设置和查询对象的属性 控制器一般提供相应 的用户接口的访问 通过访问来改变对象的属性 许多 JMF 对象都可获得控制 器接口 包括 DataSource 对象 DataSink 对象和 JMF plug ins 2 22 2 PlayerPlayer 对象对象 1 创建一个 Player 对象 通过使用媒体 Manager 来直接创建一个 Player 对象 要显示这个 Player 对象 你获取这个对象的组件并且将这些组件加到你的 applet 的外观或者应用 程序的窗口中 8 当你想创建一个新的 Player 对象时 你通过 Manager 的 createPlayer 或 者 createProcessor 的方法创建它 Manager 通过使用你指定的媒体的 URL 对 象或者 MediaLocator 对象来创建一个合适的对象 URL 对象只有在相关的 URLSteeamHandler 被安装的情况下才能被正确的构造 而 MediaLocator 则没 有这个限制 2 在 Player 对象未识别 Realized 前阻塞 许多可以被 Player 对象调用的方法要求 Player 对象在已被识别 Realized 的状态 保证当你调用这些方法之前 Player 对象已经被识别的方 法是使用 Manager 提供的 createRealizedPlayer 方法来创建 Player 对象 这 个方法提供了一个便捷的方式在一步就创建并且识别 Realize 一个 Player 对象 当这个方法被调用时 它会阻塞直到这个 Player 对象被识别 Manager 也提供了一个相同的 createRealizedProcessor 方法来创建一个已识别的 Processor 对象 注意 阻塞 Player 对象或者 Processor 对象直到被识别可能引起不好的结 果 比如 如果 createRealizedPlayer 在一个 applet 中被调用 Applet start 和 Applet stop 将不能打断 Player 对象的构造过程 3 显示媒体接口组件 Player 对象一般有两种类型的用户接口组件 一个可视化组件和一个控制 板组件 有些 Player 实现可以显示额外的组件 比如说音量控制和下载进度条 4 显示一个可视化组件 如果有 一个可视化组件就是 Player 对象表现媒体的可视化表示 即使一 个音频播放器也有可能有一个可视化组件 比如说波形显示或者其它生动的特 性 要显示 Player 对象的可视化组件 1 通过调用 getVisualComponent 得到组件 9 2 将它加到 applet 的外观表示或者应用程序的窗口中 你可以通过它的可视化组件访问 Player 对象的的显示属性 如它的 x y 坐 标 Player 组件的布局受到 AWT 布局管理器的控制 5 显示控制面板组件 Player 对象通常有一个控制板允许用户控制媒体的表示 比如说 一个 Player 对象可能一个有开始按钮 结束按钮 暂停按钮和一个用来调控音量的 滑动条与其关联 每一个 Player 对象提供一个默认的控制板 要显示这个默认的控制板 1 调用 getControlPanelComponent 得到组件 2 将返回的组件加到 applet 的外观表示和应用程序的窗口 如果你选择定义一个定制的用户接口 你可以实现 GUI 组件并且调用正确 的 Player 方法来响应用户的动作 如果你将这个定制组件注册成 ControllerListener 当 Player 对象的状态改变时 你也可以更新这个组件 6 显示一个增益控制组件 Player 对象的实现支持音频增益调节的 GainControl 接口 GainControl 提供方法调节有尿频的音量 如 setLevel 和 setMute 如果 Player 对象提供 了 GainControl 组件要显示它 1 调用 getGainControl 从 Player 对象获得 GainControl 如果返回为空 则 Player 不支持 GainControl 接口 2 在返回的 GainControl 上调用 getControlComponent 3 将返回的组件加到 applet 的外观表示或者应用程序的窗口上 注意 getControls 方法不返回 Player 对象的 GainControl 你只能通过调 用 getGainControl 来访问 GainControl 7 显示一般的控制组件 许多 Player 对象有可以被用户控制的其他的属性 比如说 一个视频 Player 对象可能允许用户调整亮度和对比度 但是他们不是通过 Player 接口 10 来管理 你可以通过调用 getControls 来得知一个 Player 对象支持哪些一般的 控制 比如说 你可以调用 getControls 来得知一个 Player 对象是否支持 CachingControl 接口 8 显示一个下载进度组件 CachingControl 接口是控制的特殊类型 它被 Player 对象实现 能够报 告它的下载进度 CachingControl 提供了一个默认的进度条组件 这个组件会 自动的随着下载进度而更新 要在 applet 中使用默认的进度条 实现 ControllerListener 接口 并且在 ControllerUpdate 方法中监听 CachingControlEvent 当你第一次收到一个 CachingControlEvent 1 当事件到达时调用 getCachingControl 方法得到缓冲控制 2 在 CachingControl 上调用 getProgressBar 以得到默认的进度条组件 3 将进度条组件加入到你的 applet 外观组件上 每次你收到一个 CachingControlEvert 检查下载是否已经完成 当 getContentProgress 返回的值与 getContentLength 一样 移除进度条 当进度条需要更新时 Player 对象抛出一个 CachingControlEvent 如果 你实现你自己的进度条组件 当 CachingControlEvent 被抛出时 你应该能监 听这个事件并且更新进度条 9 设置播放速率 Player 对象的速率决定媒体时间相对时间基线怎样变化 它定义了当时间 基线的一个单位前进的时候 媒体时间迁移几个单位 Player 对象的速率可以 被认为是一个暂时的刻度因素 比如说 当 Player 开始后 速率为 2 0 代表媒 体时间的前进速度是时间基线时间前进的两倍 理论上 一个 Player 对象的速率可以被设置为任何值 负值代表反向的播 放媒体 然而 有些媒体的格式依赖于帧 所以反向的播放或者在非标准的速 率上播放它是不可能的 也是不实际的 11 要设置速率 你调用 setRate 并且传入一个浮点类型的值作为这个暂时的 刻度因素 当 setRate 被调用时 这个方法返回当前的设置 即使它没被改变 Player 对象仅保证支持 1 0 的速率 10 设置开始位置 设置 Player 对象的媒体时间相当于在一个媒体流中设置读取的位置 对于 象文件这样的媒体数据源 媒体时间是有界限的 最大的媒体时间定义为媒体 流结束的时间 要设置媒体时间 你调用 setMediaTime 并且传入一个 Time 对象 这个对 象代表你想设置的时间 11 帧定位 有些 Player 对象允许你定位到一个视频的特殊帧 这使得你可以简单的找 到开始位置的特殊帧而不必指明这个位置的精确的时间 支持帧定位的 Player 对象实现了 FramePositioningControl 要设置帧的位置 你调用 FranePositioningControl 的 seek 方法 当你查 找一帧时 Player 对象的媒体时间的值将会设置成那一帧的开始时间 同时一 个 MediaTimeEvent 将会被抛出 有些 Player 对象可以将媒体时间和帧的位置进行转换 如果支持转换 你 可以使用 FramePositioningControl 的 mapFrameToTime 和 mapTimeToFrame 方 法来获得这些信息 支持 FramePositioningControl 的 Player 对象不需要导 出这个信息 注意在媒体时间和帧之间不存在一一对应的关系 帧是一段持 续的时间 所以一些不同的媒体时间可能会对应同一帧 12 准备开始 大多数 Player 对象不能立即开始 在播放开始前 某些硬件和软件的状况 需要被满足 比如说 如果一 Player 对象之前从未开始过 则它需要分配缓存 来存储媒体数据 或者如果媒体数据在网络设备上 Player 对象可能需要在下 载数据之前建立一个网络连接 即使 Player 对象以前曾经播放过 缓存区在当 前的媒体位置也可能包含无效的数据 12 13 识别 Realizing 和预取 Prefetching Player 对象 JMF 将一个 Player 对象的准备过程分成两个阶段 识别 Realizing 和 预取 Prefetching 在开始一个 Player 对象之前进行识别和预取使得当你 调用 start 方法时能最小化开始播放媒体的时间 并且为用户帮助创建一个响 应迅速 具有交互性的 Player 对象 实现 ControllerListener 接口使得当这 些操作发生时你能够控制它 注意 Processor 在准备过程中引入了第三个阶段 称为配置 Configuring 在这个阶段中 Processor 的选项能够被选择以指定 Processor 怎样来操纵媒体数据 要得到更多的信息 请查阅选择跟踪处理选 项 你调用 realize 方法将 Player 对象进入识别 Realizing 状态并且开始识 别过程 你调用 prefetch 方法将 Player 对象进入预取中 prefetching 状态 并初始化预取过程 Realize 和 prefetch 方法都是异步的并且会立即返回 当 Player 对象完成了要求的动作时 它会抛出 RealizeCompleteEvent 或者 PrefetchCompleteEvent Player 对象的状态描述了 Player 对象在这些状态下 的动作 Player 对象在预取状态下准备开始播放 而且它启动反应时间不能再被减 少 然而通过 setMediaTime 设定媒体时间可能使 Player 对象返回到被识别 Realized 状态并且同时使得启动时延增加 记住一个在预取完毕的 Player 对象与系统资源相关 因为有些资源 比如 说声卡 可能一次仅仅能被一个程序使用 有一个在预取完毕的 Player 对象生 存时可能会阻止其它 Player 对象开始 14 获取开始时延 要得到需要多少时间启动 Player 对象 你可以调用 getStartLatency 对 于有可变开始时延的 Player 对象 getStartLatency 的返回时间将会是最大的 可能开始时延 对于某些媒体类型 getStartLatency 可能会返回 LATENCY UNKNOWN 13 getStartLatency 返回的开始时延可能会因为 Player 对象当前的状态不同 而不同 比如说 在完成了一个预取的动作后 由 getStartLatency 返回的值 通常会更小 一个可以被加入到 Player 对象的 Controller 对象将会返回一个 有用的值一旦它被预取后 15 开始表现 一般你会通过调用 start 方法来开始表现一个媒体流 Start 方法通知 Player 对象尽可能快的开始表现媒体数据 如果必须 start 方法通过完成识 别和预取的操作使得 Player 对象开始播放 如果 start 方法是被一个已被开始 started 的 Player 对象调用 唯一的效果是一个 StartEvent 将被抛出 时钟定义了 syncStart 方法以用来同步化 请查阅同步多个媒体流获取更 多的信息 要使得 Player 对象在指明点开始媒体流 1 通过调用 setMeidaTime 指明你想开始的媒体流的点 2 在 Player 对象上调用 start 方法 16 停止表现 有四种情况媒体的表现将会停止 1 当 stop 方法被调用时 2 当指定的停止的时间到达时 3 当没有更多的媒体数据时 4 当被接收的媒体数据相对于可接受的播放速率说太慢时 当 Player 对象停止时 如果媒体源能被控制 它的媒体时间将被冻结 如 果 Player 对象在表现流式媒体 则可能不能冻结媒体时间 在这种情况下 仅 仅是媒体数据的接收被停止 数据继续被流式化 媒体时间继续前进 要立即停止一个 Player 对象 你调用 stop 方法 如果你在一个处于停止 Stopeed 状态的 Player 对象调用 stop 方法 唯一的效果是 StopByRequestEvent 被抛出 17 在一个指定的时间停止表现 14 你可以调用 setStopTime 方法来指明什么时候该停止 Player 对象 Player 对象在到达指定的停止时间将停止 如果 Player 对象的速率是正值 Player 对象将在媒体时间大于或者等于停止时间时停止 如果 Player 对象的速率是负 值 Player 对象将在媒体时间小于或者等于停止时间时停止 如果当前的媒体 时间已经大于指定的停止时间 Player 对象将立即停止 比如说 假定一个 Player 对象的媒体时间是 5 0 并且 setStopTime 设定停 止时间是 6 0 如果 Player 对象的速率是正值 媒体时间正在增加 Player 对 象在媒体时间大于或者等于 6 0 的时候将停止 然而如果 Player 对象的速率是 负值 它将反向播放 这时 Player 对象将会立即停止 因为媒体时间已经超过 了停止时间 你也可以在一个停止 Stopped 状态的 Player 对象上调用 setStopTime 方法 然而你只能设置停止时间在处于已开始 Started 的 Player 对象上 如果停止时间当前还没有设定 如果已开始 Started 的 Player 对象已经有 一个停止时间 setStopTime 抛出一个错误 你可以调用 getStopTime 来得到当前已安排的停止时间 如果时钟没有安 排的停止时间 getStopTime 方法将返回 Clock RESET 要移除停止时间以让 Player 对象持续的播放直到它到达媒体结束 调用 setStopTime Clock RESET 18 释放 Player 对象的资源 Deallocate 方法使得 Player 对象释放所有的独占资源并且最小化非独占 资源 虽然对于 Player 对象的缓存和存储管理未被指明 大多数 Player 按照 Java 对象的标准分配那么大的缓存 当 deallocate 方法调用时一个较好实现 的 Player 对象尽量释放多的内部存储 Deallocate 方法只能被处于已停止 Stopped 状态的 Player 对象调用 为了避免 ClockStartedErrors 你应该在调用 deallocate 方法前调用 stop 方 法 在正在预取 prefetching 和预取完毕 prefetched 状态下的 Player 对象上调用 deallocate 方法使得这个 Player 会返回到被识别 Realized 状 态 如果在 Player 对象在正在识别 Realizing 状态下调用 deallocate 方法 15 Player 对象将会抛出 DeallocateEvent 并且返回到未被识别 Unrealized 状态 下 一旦一个 Player 对象被识别 它将不能返回到未被识别 Unrealized 状态 一般情况下你在 Player 对象现在未被使用的时候调用 deallocate 方法 比如说 一个 applet 应该调用 deallocate 方法作为它的 stop 方法的一部分 通过调用 deallocate 方法 当释放其它资源为系统整体来使用时 程序将维护 一个指向 Player 对象的引用 JMF 不会限制一个以前被预取完毕 Prefetched 或者开始 Started 的现处于已识别 Realized 状态的 Player 对象维护信息 而这些信息将使得 Player 对象在未来某个时刻会更快 的开始 当你使用完一个 Player 对象 或者其他的控制器 并不打算在以后用到 你应该调用 close 方法 Close 方法暗示控制器 controller 将不会再被用 到并能被自己关闭 调用 colse 方法会使得控制器 controller 释放所有占 用的资源 导致它停止所有的活动 当一个控制器 Controller 被关闭后 它会抛出 ControllrClosedEvent 一个已经关闭的控制器 Controller 不能 被重新打开 在一个已经关闭的控制器 Controller 调用方法将会产生错误 19 查询 Player 对象 Player 对象可以提供关于它当前的参数的信息 这些参数包括速率 媒体 时间 持续时间 20 获得播放速率 要获得 Player 对象当前的速率 你调用 getRate 方法 调用这个方法将会 返回一个浮点型数据作为速率的值 21 获得媒体时间 要获得 Player 对象当前的媒体时间 你调用 getMediaTime 调用 getMeidaTime 返回一个 Time 类型的对象作为当前的媒体时间 如果 player 对 16 象没有在表现媒体数据 返回媒体表现开始的时间点 注意媒体时间和帧之间不存在一对一的关系 每个帧表现的是一段时间 而媒体时间在这个期间仍然会继续前进 22 获取时间基线的时间 通过得到 TimeBase 对象再调用 getTime 方法 你可以得到一个 Player 对 象的当前时间基线时间 myCurrentTBTime player1 getTimeBase getTime 当一个 Player 正在运行时 通过调用 mapToTimeBase 方法 你可以得到相 对于一个特殊的媒体时间的时间基线的时间 23 取媒体流的持续时间 因为程序经常需要得知一个特定的媒体流要运行多久时间 所有的控制器 Controller 都实现了 Duration 接口 这个接口定义了一个单一的方法 getDuration 如果速率是 1 0 持续时间代表了一个媒体对象将会运行的时间 长度 一个媒体流的持续时间仅能通过 Player 对象得到 如果持续时间不能通过 getDuration 调用返回 将会返回 DURATION UNKNOWN 如果 Player 对象还没有达到一个可以得到媒体源的持续时 间的状态时 就会出现这种情况 在稍后的时间 持续时间可能会能得到 此 时调用 getDuration 将会返回持续时间 如果媒体源没有一个已定义的持续时 间 比如说一个直播的广播 getDuration 返回 DURATION UNBOUNDED 17 18 3 3 系统分析与设计系统分析与设计 3 13 1 需求分析需求分析 3 1 13 1 1 功能分析功能分析 首先我们来看看构造这个视频播放器要达到什么样的目标 确定了目标也 就确定了代码量和程序的复杂程度 视频播放器是一个菜单驱动的简单 AWT 应 用 我用 JMF 所做的视频播放器要达到如下目标 视频播放器包含 File Action 两个菜单 File 文件菜单包含两个子菜单项 Open Exit Open 用来打开本地硬盘中的媒体文件 Exit 退出播放程序 Action 文件菜单包含两个子菜单项 Play Stop Play 开始播放视频 Stop 停止播放当前视频 3 1 23 1 2 软硬件环境分析软硬件环境分析 视频播放器可以在多种平台上运行 视频播放器的核心功能通过 JMF Java Media Framework API 实现 JMF 扩展了 J2SE 平台的多媒体能力 允许 Java 应用和 Applet 截取 回放 转换 包括音频和视频在内的多种媒体 3 23 2 概要设计概要设计 3 2 13 2 1 初步设计初步设计 我们把这个媒体播放器的设计分成两个部分 GUI 设计 伪代码设计 在 GUI 设计中 我们要了解构成程序的各个 GUI 部件 在伪代码设计中 我们用 自然语言写出程序运行原理 3 2 23 2 2 GUIGUI 设计设计 视频播放器的用户界面包含一个主窗口 两个菜单和一个打开文件的 对话框 首先我们来看看主窗口的设计 主窗口把窗口标题显示为 08 计 算机 MC 视频播放器 显示 File Action 菜单 下图显示了程序 刚启动时的主窗口 19 图 3 1 视频播放器启动时主窗口 File 菜单包含两个子菜单项 Open 菜单显示一个对话框 用来选 择本地媒体文件的位置 Exit 菜单关闭视频播放程序 另外 点击主窗口右 上角的关闭按钮也可以关闭程序 图 3 2 File 菜单 20 Action 菜单包含两个子菜单项 Play 菜单开始播放当前视频 Stop 菜单暂停播放当前视频 图 3 3 Action 菜单 点击 File Open 菜单时 Choose Video 对话框出现 选中媒体文 件之后 点击 打开 按钮即可打开媒体文件 点击 取消 按钮中止文 件打开操作 21 图 3 4 Choose Video 窗口 除了上面提到的部件之外 视频播放器还包含一个视觉部件 一个控制面 板部件 视觉部件顺序播放媒体文件包含的各帧图像 控制面板部件允许用户 调整媒体音量高低 或进行其他控制操作 例如查看媒体文件信息 3 2 33 2 3 视频播放器原理视频播放器原理 为了播放媒体 首先需要一个媒体播放器 Player 对象 这可以通过 Open 菜单获得 播放器完成从数据源接受数据 申请播放资源 并以精确 的时间顺序根据每一道的数据格式分别提交到各自的资源目标 扬声器 显示 器 整个过程和关系如下图所示 播放器对象 Player 具有若干种状态 大致可以分成创建播放器 判定请求 资源 提交数据 播放媒体数据等状态 Java 提供了 ControllerListener 接 口来监听 Player 对象的各个状态之间转变时的事件 并完成相应的处理 数据源 Player 扬声器 显示器 22 3 2 43 2 4 伪代码设计伪代码设计 前面我们了解了构成视频播放器 GUI 的各个部件 下面要开始 设想 一下 这个程序的具体构造 在正式编写代码之前 我们先用伪代码的形式写出这个 程序的运行过程 以后正式编写代码时只需把伪代码翻译成 Java 代码即可 下 面给出了视频播放器的伪代码描述 应用的类名称 Media 超类 Frame 监听器分类 动作事件 控制器事件 菜单项事件 绘图事件 窗口事件 main 为 Media 对象分配内存 调用 Media 构造函数 创建主窗口 同时 隐含地 创建 启动了 AWT 后台线程 结束主程序线程 此时 AWT 线程继续运行 Media 构造函数 设置主窗口的标题 注册窗口监听器 以处理窗口关闭事件 创建 File 菜单 创建 Open 菜单项 把 Media 对象注册成为 Open 菜单项动作事件的监听器 把 Open 菜单项加入 File 菜单 在 File 菜单中加入一条水平分隔线 按照创建 Open 菜单项的过程 创建 Exit 菜单项 创建一个菜单条 MenuBar 把 File 菜单加入到菜单条 创建 Action 菜单 创建 Play 菜单项 把 Media 对象注册成为 Play 菜单项动作事件的监听器 把 Play 菜单项加入 Action 菜单 在 Action 菜单中加入一条水平分隔线 按照创建 Play 菜单项的过程 创建 Stop 菜单项 创建一个菜单条 MenuBar 把 File Action 菜单加入到菜单条 23 把新创建的菜单条设置为主窗口的菜单条 把主窗口的大小设置为 500 350 像素 显示主窗口 结束构造函数 动作监听器 当出现动作时 如果动作事件起源于 Exit 菜单项 触发一个给窗口监听器的窗口关闭事件 返回 创建一个 Choose Video 对话框 把对话框的当前目录设置为上次关闭时的目录 显示对话框 这个对话框是一个模式对话框 如果用户没有通过对话框选择媒体文件 返回 保存用户在对话框中选择的目录 如果以前已经创建 JMF 播放器对象 关闭该对象 根据指定的目录和名字 创建一个使用 file 协议的媒体定位器 MediaLocator 对象 再利用该对象创建一个 JMF 播放器对象 如果出现异常 显示错误信息 然后返回 把主窗口的标题设置为媒体文件的名字 把 Media 对象注册为来自 JMF 播放器对象的控制器事件的监听器 让 JMF 播放器对象预先提取媒体内容 返回 控制器监听器 当控制器被关闭 如果 JMF 播放器的视觉部件存在 从 Media 容器拆除视觉部件 如果 JMF 播放器的控制面板部件存在 从 Media 容器拆除控制面板部件 24 返回 当预提取媒体内容结束 JMF 播放器对象开始播放媒体 返回 当实例化 realize 完成 获取 JMF 播放器对象的视觉部件 如果视觉部件存在 则把它加入到 Media 容器的中间 获取 JMF 播放器对象的控制面板部件 如果控制面板部件存在 则把它加入到 Media 容器的南方 执行 pack 操作 返回 窗口监听器 windowClosing 调用 dispose 以执行 windowClosed 返回 windowClosed 如果已经创建 JMF 播放器对象 关闭 JMF 播放器对象 结束程序 伪代码的前面三行声明了媒体播放器的类名称 超类的名称和 Media 类实 现的监听器 带有 main 前缀的行表示 Media 的 main 方法 类似地 带有 构造函数 前缀的行属于 Media 的构造函数 伪代码的其余内容分成五个 监听器分区 动作监听器 控制器监听器 菜单项监听器 窗口监听器 每一 个分区分别包含一个或多个方法 25 4 4 系统的实现系统的实现 4 14 1 自定义类的说明自定义类的说明 类名 MediaPlayer 作用 主类 继承的父类 JFrame 类 实现的接口 ActionListener ControllerListener 主要方法说明 MediaPlayer 构造方法 设置对象的数据成员 完成窗口 包括菜单 的设置 等 SetupMenu 方法 用于构造程序窗口的菜单 被 MediaPlayer 调用 ActionPerformed 方法监听来对象的菜单事件 根据相应命令做出相应的反映 ControllerUpdate 方法用于处理 JMF 传出的关于播放器的事件 要进行正常播 放 必须利用这个方法捕捉合适的事件并调用 Player 相应的方法来实现 4 24 2 程序代码程序代码 4 24 2 1 1 代码编写代码编写 我们把 3 2 3 的伪代码转换成 jav 代码 import java awt import java awt event ActionEvent import java awt event ActionListener import java awt event WindowAdapter import java awt event WindowEvent import javax media ControllerEvent import javax media ControllerListener import javax media MediaLocator import javax media RealizeCompleteEvent import javax media bean playerbean MediaPlayer import javax swing JPanel 26 import javax swing JFrame import javax swing SwingUtilities import javax swing JList import java awt BorderLayout import javax swing JSplitPane import java awt Component import java util Vector public class JMF MC extends JFrame implements ControllerListener ActionListener MediaPlayer Player private String filename private static final long serialVersionUID 1L private Vector vct new Vector jve decl index 0 private JPanel jContentPane null private JSplitPane jSplitPane null private JPanel playPanel null private JList jList null private JSplitPane getJSplitPane if jSplitPane null jSplitPane new JSplitPane 27 jSplitPane setDividerSize 5 jSplitPane setResizeWeight 0 8 jSplitPane setRightComponent getJList jSplitPane setLeftComponent getPlayPanel return jSplitPane private JPanel getPlayPanel if playPanel null playPanel new JPanel playPanel setLayout new BorderLayout return playPanel private JList getJList if jList null jList new JList jList addMouseListener new java awt event MouseAdapter public void mouseClicked java awt event MouseEvent e TODO Auto generated Event stub mouseClicked if e getClickCount 1 String str String jList getSelectedValue if str null return filename str System out println str 28 if e getClickCount 2 String str String jList getSelectedValue if str null return filename str play return jList public static void main String args SwingUtilities invokeLater new Runnable public void run JMF MC thisClass new JMF MC thisClass setTitle 08 计算机 MC 视频播放器 thisClass setDefaultCloseOperation JFrame EXIT ON CLOSE thisClass setVisible true public JMF MC initialize 29 private void OpenFile FileDialog fd new FileDialog this Choose Video FileDialog LOAD fd setVisible true filename fd getDirectory fd getFile System out println filename if filename equals return else if filename equals nullnull return boolean j false for int i 0 i vct size i if vct get i toString equals filename j true break if j false vct add filename jList setListData vct private void stop if Player null Player stop 30 Player deallocate private void play try if fil
温馨提示
- 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
- 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
- 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
- 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
- 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
- 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
- 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。
最新文档
- 药理学全套题库及答案
- 2025年上海市浦东模范中学中考数学一模试卷(含答案)
- 抗灾减灾课件
- 2025届广东省佛山市禅城区高三下学期“供题训练”物理试题(含答案)
- 2024-2025学年河南省洛阳市伊滨区科普版(2012)六年级下册期中考试英语试卷(含答案)
- 2025年超二代微通道板合作协议书
- 历年五一建模题目及答案
- 怀化化学题目及答案
- 抗击疫情安全培训课件
- 2025年阻燃ABS热塑性弹性体合作协议书
- 关于介绍足球的英语课件
- 风电发电机组电控系统知识-安全链部分课件
- PMBOK指南第6版中文版
- 第五章-针织服装设计与样板制作经典版课件
- 肿瘤的介入治疗课件最新版
- 基坑土石方开挖安全专项施工方案
- 中小学心理健康教育指导纲要考试试题及答案
- 社会统计学-全套课件
- 物流公司道路运输许可证申请资料范文
- 六年级上册英语试题Unit1 I go to school at 8:00. 阶段训练一-人教精通版-(无答案 )
- (完整版)湘教版地理必修一知识点总结
评论
0/150
提交评论