前言:想要写出一篇令人眼前一亮的文章吗?我们特意为您整理了5篇媒体播放范文,相信会为您的写作带来帮助,发现更多的写作思路和灵感。
【关键词】多媒体;API函数;VB;播放器
1.引言
多媒体技术是一种把文本(Text)、图形(Graphics)、图像(Images)、动画(Animation)和声音(Sound)等形式的信息结合在一起,并通过计算机进行综合处理和控制,能支持完成一系列交互式操作的信息技术。多媒体技术的发展改变了计算机的使用领域,使计算机由办公室、实验室中的专用品变成了信息社会的普通工具,广泛应用于工业生产管理、学校教育、公共信息咨询、商业广告、军事指挥与训练,甚至家庭生活与娱乐等领域。
多媒体播放器的设计是一门集计算机技术和数字多媒体技术于一体的综合设计。随着中国计算机技术、宽带网络技术的发展,越来越多的人开始重视多媒体播放器的发展与应用。
2.系统的规划与研究
播放器的开发阶段有设计、编码和测试3个基本活动组成,其中,“设计阶段”是获取高质量、易维护系统的一个最重要环节。采用任一种软件设计方法都将产生系统的总体结构设计、系统的数据设计和系统的过程设计,如图1所示,描述了播放器开发过程的信息流程。
3.播放器的设计与实现
利用Visual Basic 中的Windows Media Player控件开发Windows下的多媒体应用程序是一种方便简单的方法。
播放器的主界面,遵照界面简洁、操作简单、人性化的原则进行设计。主要包括播放控制主界面的设计、视频显示区域的设计即可视化界面的设计、播放列表界面的设计、相关信息显示区域的设计等。
媒体播放器主要的功能是播放音频文件和视频文件两种,音频播放主要实现对目前常用的音频文件进行播放,如:mp3、wav、mid、rmi、midi、au等等。可以完成播放列表导入和保存、文件打开和播放信息显示等功能。
视频播放主要实现对常用的视频文件进行播放,如:avi、mpeg、rm、rmvb等等。可以实现可视化窗口的全屏幕播放和原始大小播放、可视效果切换等功能。
另外,播放器在实现视频全屏幕播放后,没有用原有的控制对象标志,而是将它在属性栏中隐藏了。其按键功能由播放控制面板命令按钮来实现,控制按钮上显示功能汉字信息,在命令按钮事件中,实质上是调用Windows Media Player控件中属性的各项功能。图2为播放器的功能模块图。
4.总结
该设计关键采用了VB 6.0环境中的Windows Media Player控件,可以播放Windows Media Player所支持的文件格式,包括音频文件、视频文件、动画等,如不能播放视频文件,需要安装相应的解码器,如Real Codec Pack等。与其它播放播放器相比,该播放器具有支持格式多样、界面美观、功能齐全、占用空间小的特点。与现有多媒体资源应用状况紧密结合,既具有很强的直观感,又不失一般性。
参考文献
[1]彭波,孙一林.多媒体技术应用[M].北京:机械工业出版社,2006:1-21.
[2]赵子江.多媒体技术应用教程[M].北京:机械工业出版社,1957:1-18.206-207.
[3]陈明.多媒体技术与应用[M].北京:清华大学出版社,2004:5-10.
[4]洪锦魁.精通Visual Basic 6.0中文版[M].北京、广州、上海:世界图书出版社,2000.
[5]刘炳文.Visual Basic图形与多媒体程序设计[M].北京:清华大学出版社,2002:5-28.
[6]魏江江,林少景.Visual Basic API编程百例通[M].北京:科学出版社,2001.
[7]谭浩强,薛淑斌,袁玫编著.Visual BASIC程序设计[M].北京:清华大学出版社,2000:256-266.
[8]高智勇.Visual BASIC 6.0实例教程[M].北京:航空工业出版社,2000.
[9]Michael Halvorson.Visual Basic6学习指南[M].北京:机械工业出版社,1999.
[10]刘炳文.精通Visual Basic 6.0中文版[M].北京:电子工业出版社,1999.
关键词: 流媒体; JSP; Html5; Chrome浏览器; 视频控制
中图分类号:TP37 文献标识码:A 文章编号:1009-3044(2016)18-0191-03
Design and Implementation of Playing Streaming Media Based On JSP
YANG Zi-xiang,LIN Peng
(Tianjin Open University, Tianjin 300191, China)
Abstract: With the development of Internet, playing web video is more and more on web. However, if playing the video through the HTML5 or the Html tag, then dragging and dropping the video only after the completion of the video completely downloaded before using. Through research and analysis principles of streaming media server of Windows Media Services, and research Http package of Chrome browser, the paper successfully devised playing streaming media with JSP program. By publishing program on Tomcat, users can drag and drop the video during playback, successfully resolving the problem of the HTML5 or the Html tag with not drag.
Key words:Streaming Media; JSP; Html5; Chrome browser; Video Control
1 概述
随着Internet的发展,网页视频播放的使用越来越多。因此,视频播放的用户体验也越来越实用;视频的播放、暂停、定点播放等操作的需求也就越来越大,而且也更符合用户实际浏览视频的要求。但是,目前如果直接通过HTML5的或者Html的标签播放视频的话,视频的拖拽功能只有在视频完全下载完成后才能使用。这就会加大服务器的压力,因此越来越多的用户开始使用流媒体。
所谓流媒体是指采用流式传输的方式在Internet播放的媒体格式。流媒体又叫流式媒体,它是指商家用一个视频传送服务器把节目当成数据包发出,传送到网络上。用户通过解压设备对这些数据进行解压后,节目就会像发送前那样显示出来。流媒体的出现极大地方便了人们的工作和生活。目前,使用流媒体的话都会通过流媒体服务器(比如Windows Media Services等)来搭建流媒体平台[1-4]。
JSP作为一种网页开发语言,在网站的开发中使用者的比例很大;因此,使用JSP开发的网站对视频播放的需求也会越来越多。但是,如果直接通过JSP后台平台结合HTML5的标签进行视频播放的话,就会出现网页中视频无法拖拽,从而不能实现定点播放等功能。所以,通过JSP语言实现视频的流媒体播放对于JSP网站来说,不仅可以省去借助流媒体服务器的烦恼,而且可以实现在线视频播放的随意控制,从而满足用户的实际需求。
2 基于流媒体服务器的网页播放探究
流媒体服务器的使用,解决了视频播放过程中,直接访问网络视频资源导致的视频拖拽问题。因此,流媒体服务器的网页视频资源的访问方式对于本文的设计来说,具有很大的价值。Windows Media Services作为一种流媒体服务器,是Windows Server服务器系统中使用频率很高而且性能很好的流媒体服务器。本文通过Chrome浏览器访问Windows Media Services中视频资源的流程研究发现,在视频拖拽的控制中,Chrome浏览器都会发送Http请求包;Windows Media Services接收到浏览器的请求后,再根据Http中包含的内容返回相应的视频片段。具体的流程如图1所示。
如图1中流媒体视频在Chrome浏览器和Windows Media Services流媒体服务器之间的交互可以看出,无论视频的播放还是中间视频播放控制,都是Chrome发送Http包进行控制;而Windows Media Services流媒体服务器则是负责对视频片段的返回。因此,本文使用Chrome浏览器访问对已经在Windows Media Services流媒体服务器中的视频,通过Chrome浏览器中的Network网络工具,对Http包进行抓取。图2中显示的是视频点击开始播放后,即视频从头开始播放,抓取的Http请求包的头文件内容。图3和图4中显示的则是视频播放过程中点击视频任意位置后,抓取的Http请求包的头文件内容。
3 基于JSP的在线流媒体播放的实现
在第二节中,本文通过Chrome的Http包的追踪功能,截取了视频在播放控制过程中不同播放位置请求的包。通过图2、图3和图4的追踪结果可以看到他们的Request Headers以及Response Headers中的部分头文件字段是不同的,具体的信息比较如表1所示。
由表1中可以看到,三个图中的Http包中只有Range、Content-Range字段是不同的,其他的字段的内容根本就没有发生变化。其中,Range是Request Headers中的字段,Content-Range是Response Headers中的字段。在表1中还可以发现,Content-Range字段的内容和Range字段的内容有一定的关系;Content-Range内容中“-”前的数值和Range是一致的。同时,在表1中也可以发现,Content-Range字段和Content-Length字段有一定的关系;Content-Range内容中“/”后的数值和Content-Length是一致的。我们知道,Http包中的Content-Length的作用主要是记录文件的长度,因此可以在服务器端通过程序求出文件的大小。
由于Http包中的Request Headers是由浏览器进行发出并封装的,因此本文的程序无法控制包中的Request Headers内容。但是,Http包中的Response Headers是由服务器封装后返回给浏览器的;因此,本文的程序设计将会根据Http包中的Request Headers字段内容,对Http包中的Response Headers字段进行封装返回给服务器。根据以上的分析,本文通过JSP进行程序设计如下:
@RequestMapping(value = { "/videos/{path}" })
public String displayVideo(HttpServletRequest request,
HttpServletResponse response, @PathVariable String path) {
try {String filePath = videoDir + path + ".mp4";
File file = new File(filePath);
if (!file.exists()) {
response.sendError(404);
LOG.error("未找到文件" + file.getCanonicalPath());}
Long fileLength = file.length();
LOG.debug("文件找到了,大小为" + fileLength);
String range = request.getHeader("range");
if (range != null && !range.equals("")) {
LOG.debug("请求的名字是range,内容是" + range); }
Long startPos = 0l;
if (range != null && !range.equals("")) {
Pattern pattern = Pattern
.compile("^bytes\\=(\\d+)(?:\\-(\\d+)?)?$");
Matcher matcher = pattern.matcher(range);
LOG.debug(matcher.matches());
startPos = Long.parseLong(matcher.group(1), 10);
LOG.debug("成功截获range,开始位置是" + startPos);
response.setStatus(206);
} else {
response.setStatus(200);
LOG.debug("从头开始传送");}
InputStream is = new FileInputStream(file);
OutputStream os = response.getOutputStream();
byte[] buffer = new byte[1024];
response.addHeader("Content-Range", "bytes " + startPos + "-"
+ (fileLength - 1) + "/" + fileLength);
response.addHeader("Content-Length", fileLength.toString());
response.setCharacterEncoding("UTF-8");
response.setContentType("video/mp4");
response.setHeader("Accept-Ranges", "bytes");
is.skip(startPos);
int length = is.read(buffer);
while (length > 0) {
os.write(buffer, 0, length);
length = is.read(buffer); }
os.flush();
os.close();
is.close();
} catch (Exception err) {
if (err.getClass()
.getName()
.equals("org.apache.catalina.connector.ClientAbortException")) {
LOG.debug("客户挂断了");
} else {
err.printStackTrace();}}
return null; }
在本文的程序设计中,浏览器的视频请求URL路径的后端是通过JSP中的Spring框架进行控制,在路径中的/videos/{paths}即是视频路径存储在磁盘的相对位置;在程序中,视频的读取并没有经过中间的流媒体服务器,而是直接读取在磁盘中的视频文件。经过程序在Tomcat7上测试之后,视频在播放的过程中,用户可以根据需求随意拖拽,解决了Html5中标签不能播放的问题。具体的如图5所示,图中显示的是程序后视频随意播放截取的Http包。经比较,与文中的图3、图4中间播放的Http包的内容是相似的,实现了流媒体播放的效果。
4 结论
本文通过分析Windows Media Services流媒体服务器中视频拖拽播放控制过程中,Chrome浏览器发送的Http包的信息,得出了浏览器播放视频时播放控制和Http包中Request Headers、Response Headers头文件的关系。并且,本文通过JSP程序语言的设计,成功实现了流媒体服务器控制视频播放的原理。本文设计的程序到Tomcat后,经过该程序访问的视频都可以在浏览器端随意拖拽播放视频,解决了Html5的标签不能直接播放服务器磁盘中视频的弊端,也省去了流媒体服务器视频的任务。
参考文献:
[1] 蒋太杰. Windows Media Services及其在远程教育中的应用[J]. 指挥技术学院学报, 2001, 12(6): 81-85.
[2] 王雪婷, 于勇. Windows Media Services流媒体技术与实现[J]. 信息技术与信息化, 2006(1): 51-53+64.
1、在“初始化”图标窗口中初始化所用变量,输入如下:
startframe:=1
endframe:=1
2、“电影”图标的设置。双击此图标,出现的属性窗口设置如下:
1) Concurrency选项设置为“Concurrent”,其作用是在运行电影图标的同时运行下面的交互图标,以激活控制按钮。
2) Play选项设置为“Fixed Number of Times”,并在下面的输入框中输入1,作为播放的次数。
3) 在Start Frame中输入变量“startrame”,在End Frame中输入变量“endframe”。由于这两个变量初值都是1,运行时电影会静止在第一帧,播放则由下面的按钮控制。
3、按钮响应的设置。分别双击交互图标右侧的五个按钮响应标志,在打开的属性窗口中,选中“Perpetual”,Branch选项设为“Return”,并适当调整五个按钮的位置和大小。
4、各种控制的实现。
1) 在“从头播放”图标中输入:
startframe:=1
endframe:=MediaLength@"电影"
MediaPlay(IconID@"电影")
其中系统变量MediaLength作用是返回指定数字电影的长度。
2) 在“暂停播放”图标中输入:
MediaPause (IconID@"电影",True)
函数MediaPause 用来暂停一个媒体文件的播放。
3) 在“继续播放”图标中输入:
startframe:=MediaPosition@"电影"
endframe:=MediaLength@"电影"
MediaPlay(IconID@"电影")
系统变量MediaPosition用来指示媒体文件播放到的当前位置。
4) 在“逐帧向后”图标中输入:
startframe:=MediaPosition@"电影"
endframe:= MediaPosition@"电影"+1
MediaPlay(IconID@"电影")
5) 在“逐帧向前”图标中输入:
startframe:=MediaPosition@"电影"
endframe:= MediaPosition@"电影"-1
关键词:移动互联网 iOS系统 流媒体 软件设计
中图分类号:TN919.8 文献标识码:A 文章编号:1007-9416(2012)12-0116-01
流媒体主要是指在互联网中,对播放的媒体格式采用流式传输的方式进行传播。移动流媒体技术的应用,实现了在移动设备上进行视频播放的功能。随着互联网技术和智能手机的盛行,流媒体技术在智能手机中的运用,满足了消费了移动互联的需求,此时的智能手机在操作系统方面也呈现出多样化的发展,其中iPhone OS系统成为最受欢迎的系统之一,其软件数量的增长速度非常快。
1、iPhone OS系统平台及开发工具
iPhone OS也称之为iOS,是苹果公司专门为iPhone所开发的一款操作系统,在苹果系列产品中陆续套用,该系统最大的优势在于人机操作及UI设计非常优秀,携带软件种类比较丰富。
1.1 系统架构
iOS系统主要分为四个部分:核心操作系统层、核心服务层、媒体曾及可轻触层。核心操作系统层位于系统架构的最底层,包括文件系统、电源管理、内存管理及一些操作系统个任务,能与硬件设备直接进行交互。核心服务层的作用是辅助访问iPhone OS系统。媒体层的作用是通过它来实现各种媒体文件在应用程序中得以使用,可以进行视频和音频的录制,绘制图形及制作简单的动画等。可轻触层位于最上层,为应用程序提供各种有用框架,大部分和用户界面相关,实质上就是对设备上的触摸交互操作进行控制。
1.2 开发工具
在进行iOS系统开发中,苹果公司主要采用iPhone SDK开发工具包,在标准C++编程语言基础上,通过该软件翻译为Objective-C语言,这种语言是苹果标准语言,然后编译为iPhone软件格式。苹果公司为开发人员还提供集成开发环境Xcode,主要用于iPhone应用程序,该开发工具属于一条龙式的应用程序,可以用作构建应用、代码编辑及程序调试等,是一种快捷的方式,该工具也可以进行辅助开发影城程序、数据库、工具、嵌入包及驱动程序等。此外,iOS开发工具中,最重要的一个工具就是iPhone模拟器,是一种重要的测试应用程序工具。
2、流媒体播放器软件设计
从iPhone,iPad等移动设备的实际应用中,苹果公司对实现流媒体技术开发了HTTP Live Streaming协议。在该协议中,音频、视频文件均有服务器提供给客户端。所以,该软件系统的结构主要分为服务器端与客户端。
2.1 系统服务器端设计
该协议技术的服务器组成包含两个部分:编码器与流分割器。其主要能使对输入的视频或者音频媒体内容进行编码,封装为适合的内容格式进行传送。编码器的主要作用是对输入的视频、音频文件采用H.264标准进行编码,然后采用MPEG-2输出,流分割器软件将文件分割为等间隔的片段,保存成.ts文件。分割器完成后,都会生成一个新媒体文件,通过索引文件进行地质的跟踪与查找,可以通过对分割文件进行加密处理。
2.2 系统客户端设计
通过iPhone OS平台设计,视频模块通过流媒体播放器对网站中的资源进行播放。通过流媒体播放器,用户能够之间观看到网站中的视频,还可以进行分享。其中,视频模块主要包含以下页面:
(1)热门视频播放列表。直接在主页面上点击“视频”,系统就会进入到热门视频播放列表,表示当前网站最热门的视频,列表将视频的主要信息呈现出来,橙色字体为视频标题。点击任意一行即可进入视频介绍页面。点击“返回”即可退回主页面。点击右上角“刷新”,可以对当前页面进行刷新。
(2)同类视频播放列表。视频列表对所有的视频全部通过分类列出,选中任意类别即可进入到该类视频播放列表,与热门视频播放列表相同,每一行都对视频主要信息进行罗列,进入视频播放页面及返回上一列表的方法都是相同的。不同的是这部分增设了分页功能,如果视频数量过多,无法在一页显示,则可以点击列表最后一行的“更多”进行查看。
(3)视频简介页面。不管是在热门视频列表或者是分类视频列表中选中任意一个视频以后,即可进入到简介页面,橙色字体是视频的标题,黑色字体为视频内容简介。点击右下角“播放”就可以观赏视频。如果通过简介对该视频没有兴趣,可以返回上一层,重新选择,如果喜欢该视频,并且想与朋友一起分享,可以点击“分享”,将视频链接到微博中。
(4)视频播放界面。点击“播放”就可以对视频进行观看,也就进入到了视频播放界面。如果对正在播放的画面进行点击,就可以对播放运行的状态进行控制,包含暂停、播放、快进、快退等,通过右上角的“完成”实现对视频播放的控制,此外,还可以实现全屏播放。
(5)视频分享界面。进行视频分享的时候,点击”分享”即可进行分享界面。可以选择所要分享到的地址,通过授权然后登陆地址以后进行分享,视频就可以分享到该链接地址。不管是要分享到何处,所要采取的操作原理都是一样的,如果不想分享,直接点击取消就可以返回到视频简介页面。
3、结语
随着网路技术的飞速发展,移动通信行业真正的步入了移动信息的时代,智能手机的普及,使应用软件呈现出多样化的发展趋势。流媒体播放器软件属于诸多应用程序中的一种,尽管与PC产业还有一定的差距,但其发展速度惊人,必定会在不久的将来迎头赶上。
参考文献
[1]施佳子.iPhone平台移动流媒体播放器的实现与优化[J]. 华中科技大学,2009(1).
[2]叶汝军,丁建峰.虚拟存储技术在流媒体管理系统中的应用[J].黑龙江科技信息,2008(25).
关键词:ActiveX;外部函数;菜单;按钮;滑块;播放器
中图分类号:TP311文献标识码:A 文章编号:1009-3044(2008)11-20329-03
1 前言
Authorware作为一种主要面向非程序员的优秀的交互式多媒体创作工具,为了满足一些高级设计人员进行复杂程序创作的需要,Authorware从4.0版本开始提供了对ActiveX控件和外部函数的支持,由于有许多软件厂商支持ActiveX技术,所以大多数功能都能找到相应的ActiveX控件。在Authorware中,通过调用ActiveX控件来直接使用现成的程序模块,可省掉许多繁琐的编程,而且几乎可以完成任何工作。
目前,媒体播放器越来越追求个性化,为了满足个性化的需求,我们可以借助图形图像处理软件使播放界面个性化,在Authorware 7.0中利用控件以及外部函数能设计出播放各种媒体的个性化播放器。在设计视频播放控制时,要注意播放、暂停、继续、停止、快进、后退等操作的激活条件,进度滑块及音量滑块能及时地响应交互。在Authorware 7.0中设计的媒体播放器运行界面如图1所示。
2 ActiveX控件的应用
ActiveX控件通常以动态链接库的形式存在,其设计思想是将一个程序嵌入到另一个程序中,这样就可使它能够随意地应用到各种场合。ActiveX控件的数据输入和函数功能执行都必须通过容器,因此ActiveX控件和容器之间必须有一些特定的接口协议。ActiveX控件必须具备属性(property)、方法(method)和事件(event),通过属性的名称、方法的名称及参数,容器可以存取和改变ActiveX控件的属性参数。通过事件,比如属性参数的改变、用户按下鼠标左键等,ActiveX控件通知容器进行响应相关操作。
2.1 ActiveX控件的安装
在开发Authorware的应用程序时,如果利用了ActiveX控件,在打包时要注意两点:(1)在用户的应用程序中需附带上所需的支持文件,即在应用程序的“Xtras”目录里附带上Activex.x32,因为只有这样应用程序才能够正常地执行,否则程序中的ActiveX控件是无法使用的。但是需要注意的是打包程序无须附带上Actxpriv.x32,否则会造成不可预料的后果,因为它主要负责设计时利用ActiveX控件的界面。(2)要将所需的ActiveX控件相关文件(*.OCX或*.DLL)复制到硬盘相应的文件夹中(Windows NT以后的操作系统是%systemroot%\system32),本播放器应用程序在设计时需要复制MSDXM.OCX、COMDLG32.OCX、FM20.DLL、FM20CHS.DLL四个文件,然后将其在Windows系统中注册。
2.2 ActiveX控件的注册
设计Authorware应用程序时,如果要使用Authorware没有提供的控件,使用前要先在Windows中进行手动注册。如果我们的程序中使用了控件且要交给用户使用,在程序中应先检测用户机中是否注册了该控件,若没有就要进行自动安装、自动注册。本播放器使用时需要检测Microsoft Forms 2.0 ScrollBar、Microsoft Common Dialog Control和Windows Media Player三个控件,以便确定是否要安装、注册。
注册的方法有两种:
(1)手动注册
方法:先将所需的ActiveX控件相关文件(如MSDXM.OCX、COMDLG32.OCX、FM20.DLL、FM20CHS.DLL)复制到硬盘相应的文件夹中(Windows NT以后的操作系统是%systemroot%\system32)。然后手动注册,即单击Windows的“开始”菜单,选择“运行”命令,在打开的对话框中输入以下命令: regsvr32.exe,如regsvr32.exe MSDXM.OCX。
regsvr32.exe是Windows自带的ActiveX注册工具,可以在Windows的系统目录中找到。
(2)自动注册
方法:利用Authorware 中的Xtra ActiveX 里的函数来进行注册。对ActiveX控件注册的格式如下: ActiveXControlRegister("")。
本播放器应用程序使用了三个控件,图2是媒体播放器设计窗口。
图标FileDialog负责打开文件,用的是Microsoft Common Dialog Control控件;图标VolumeBar负责音量调节,图标PositionBar负责进度处理,两者用的是同一种控件Microsoft Forms 2.0 ScrollBar;图标MediaPlay负责媒体播放,用的是Windows Media Player控件。在计算图标Register中设置程序进行自动检测、安装和注册,程序如下:
――获取三个控件的classID
classIDScrollBar:="{DFD181E0-5E2F-11CE-A449-00AA004A803D}"
classIDDialog:="{F9043C85-F6F2-101A-A3C9-08002B2F49FB}"
classIDMediaplay:="{22D6F312-B0F6-11D0-94AB-0080C74C7E95}"
――获取系统文件夹
WindowsPath:=getosdirectory()
――判断当前系统是否支持控件注册
if ActiveXInstalled()=-1 then
――判断Microsoft Forms 2.0 ScrollBar滚动条控件是否已安装
if ActiveXControlQuery(classIDScrollBar)=0 then
――拷贝FM20.DLL和FM20CHS.DLL两个文件到系统目录
CopyFile(FileLocation^"FM20.DLL",WindowsPath^"\\system32\\FM20.DLL")
CopyFile(FileLocation^"FM20CHS.DLL",WindowsPath^"\\system32\\FM20CHS.DLL")
――注册Microsoft Forms 2.0 ScrollBar滚动条控件
ActiveXControlRegister(WindowsPath^"\\system32\\FM20.DLL")
end if
――判断、注册Microsoft Common Dialog Control,version 6.0通用对话框控件
if ActiveXControlQuery(classIDDialog)=0 then
CopyFile(FileLocation^"COMDLG32.OCX",WindowsPath^"\\system32\\COMDLG32.OCX")
ActiveXControlRegister(WindowsPath^"\\system32\\COMDLG32.OCX")
end if
――判断、注册Windows Media Player 6.4控件
if ActiveXControlQuery(classIDMediaplay)=0 then
CopyFile(FileLocation^"MSDXM.OCX",WindowsPath^"\\system32\\MSDXM.OCX")
ActiveXControlRegister(WindowsPath^"\\system32\\MSDXM.OCX")
end if
end if
3 弹出式菜单
现在许多播放器都有弹出式菜单功能,如在图1中的MENU按钮上单击时会出现有“打开文件”、“全屏播放”和“退出”三个子菜单项的菜单,且单击某个子菜单项时执行相应操作。其设计原理是创建菜单、激活菜单、响应子菜单项。
3.1 创建菜单
计算图标BuildMenu中的程序负责创建菜单,mCreatePopupMenu()、mAppendMenu( Menu, Flags , MenuID , MenuText )、mMenuHookOn( WindowHandle )函数都置于外部函数budmenu.u32中,使用时需载入到Authorware中,程序如下:
――选择的菜单项的ID的初值
LastMenuID := -1
――添加一个filename主菜单项
filemenu := mCreatePopupMenu()
mAppendMenu( filemenu , 0 , 10 , "打开文件")
mAppendMenu( filemenu , 0 , 11, "全屏播放")
mAppendMenu(filemenu,2048,0,"")
mAppendMenu( filemenu , 0 , 12 , "退出")
――设置与Authorware通信的消息钩子
mMenuHookOn( WindowHandle )
3.2 激活菜单
为了确保交互灵活,按钮响应MenuActivation的响应需设为永久、返回,该响应包含的两个计算图标FileMenuTrack和ReturnLastMenuID的顺序不可颠倒。
(1)计算图标FileMenuTrack的程序为:
――激活菜单
mTrackPopupMenu(filemenu,0,ResponseLeft@“MenuActivation”+WindowLeft,ResponseTop@“MenuActivation”+ResponseHeight@“MenuActivation”+WindowTop,0,WindowHandle,0 )
(2)计算图标ReturnLastMenuID的程序为:
――获取最后选择的菜单项的ID
LastMenuID := mGetLastMenuID()
Checked@"MenuActivation" := FALSE
3.3 响应子菜单项
根据获取的最后选择的子菜单项的ID 值来执行相应的响应为永久、返回的条件响应:LastMenuID=10 、LastMenuID=11和LastMenuID=12,从而实现文件打开、全屏播放和退出。
(1)计算图标LastMenuID=10的程序为:
――打开文件
SetSpriteProperty(@"FileDialog", #dialogtitle, "请选择一个视频文件:")
SetSpriteProperty(@"FileDialog", #BaseURL, FileLocation)
SetSpriteProperty(@"FileDialog", #filter, "视频文件|*.mpg;*.avi;*.mpeg;*.dat;*.asf")
CallSprite(@"FileDialog", #showopen)
getFile:=GetSpriteProperty(@"FileDialog", #FileName)
SetSpriteProperty(@"MediaPlay", #FileName,getFile)
SetSpriteProperty(@"MediaPlay",#displaysize,4)
CallSprite(@"MediaPlay",#play)
LastMenuID:=-1
(2)计算图标LastMenuID=11的程序为:
――设置为全屏播放
SetSpriteProperty(@"MediaPlay",#displaysize,3)
LastMenuID:=-1
3)计算图标LastMenuID=12的程序为:
――退出
mMenuHookOff()
mDestroyMenu(filemenu)
Quit()
4 按钮控制
4.1 按钮激活条件
在设计按钮控制时,要合理设置播放(从头开始)、暂停、继续、停止(回到开头)、快进、后退等按钮的激活条件,文件没打开所有按钮应不可用,播放时继续按钮应处于隐藏状态,暂停时停止按钮不可用但继续按钮激活,停止时暂停按钮不可用且继续按钮隐藏,视频正常播放结束时暂停、停止、快进不可用且继续隐藏。
4.2 程序设置
为了实现上述要求,在设计时每一个按钮交互都要从两方面考虑:激活条件和程序内容。
play:激活条件为playfile"",计算图标内容为:
SetSpriteProperty(@"MediaPlay", #CurrentPosition,1)
CallSprite(@"MediaPlay", #Play)
pause:激活条件为(playstate=2)&(CurrentPosition
CallSprite(@"MediaPlay", #Pause)
resume:激活条件为(playstate=1)&(CurrentPosition
CallSprite(@"MediaPlay", #Play)
stop:激活条件为(playstate=2)&(CurrentPosition
SetSpriteProperty(@"MediaPlay", #CurrentPosition,1)
CallSprite(@"MediaPlay", #stop)
fastforward:激活条件为CurrentPosition
Duration:=GetSpriteProperty(@"MediaPlay", #Duration)
CurrentPosition:=GetSpriteProperty(@"MediaPlay", #CurrentPosition)
if CurrentPosition
NewPosition:=CurrentPosition+15
else
NewPosition:=Duration
end if
SetSpriteProperty(@"MediaPlay", #CurrentPosition,NewPosition)
CallSprite(@"MediaPlay", #play)
fastreverse:激活条件为CurrentPosition>1,计算图标内容为:
Duration:=GetSpriteProperty(@"MediaPlay", #Duration)
CurrentPosition:=GetSpriteProperty(@"MediaPlay", #CurrentPosition)
if CurrentPosition>15 then
NewPosition:=CurrentPosition-15
else
NewPosition:=0
end if
SetSpriteProperty(@"MediaPlay", #CurrentPosition,NewPosition)
CallSprite(@"MediaPlay", #Play)
5 滑块控制进度及音量
5.1 滑块作用
拖动水平滑块,调整文件播放进度,且滑块在水平滚动条上的位置与文件当前进度的百分比一致。拖动垂直滑块,调整音量大小,且滑块在垂直滚动条上的位置与系统音量大小的百分比一致。
5.2 事件响应设置
在两个事件响应BarSetMaster和BarSetPosition中,响应都设为永久、返回,事件响应BarSetMaster的事件设为发送“图标VolumeBar”的事件“Change”, 事件响应BarSetPosition的事件设为发送“图标PositionBar”的事件“Change”。
(1)计算图标BarSetMaster内容为:
volume:=GetSpriteProperty(@"VolumeBar",#value)
baSetVolume("master",100-volume)
(2)计算图标BarSetPosition内容为:
position:=GetSpriteProperty(@"PositionBar",#value)
Duration:=GetSpriteProperty(@"MediaPlay", #Duration)
CurrentPosition:=position/100*Duration
SetSpriteProperty(@"MediaPlay", #CurrentPosition,CurrentPosition)
CallSprite(@"MediaPlay", #Play)
PauseFlag:=1
6 结束语
在Authorware中如果能够合理地运用ActiveX控件和外部函数,个性化媒体播放器可以设计的非常完善,各种功能都能实现,即使是滑块动态地显示当前进度、播放状态等也能较好地解决。
参考文献:
[1] 毕广吉.Authorware多媒体开发程序设计与典型实例[M].北京:人民邮电出版社,2004.