主题:  [教程]使用DirectMediaXtra制作内部媒体播放器

dreamexpress_5d

职务:普通成员
等级:1
金币:10.0
发贴:2229
注册:2003/7/2 16:32:57
#12005/8/19 15:35:00
DreamExpress系列(三):[教程]使用DirectMediaXtra制作内部媒体播放器
--------------------------------------------------------------------------------------------------------

一、概述

使用Authorware播放声音或视频时,经常要用DirectMediaXtra插件,它是个优秀的媒体播放插件。DirectMediaXtra提供了很多控制函数,可以方便地控制声音、视频文件的播放。其默认的播放界面比较简单,只提供了一个“播放/暂停”按钮与一个进度条。(图一)

图片如下:


本教程教大家使用DirectMediaXtra来制作一个Authorware程序的内部播放器。该播放器可以供程序内任何需要播放声音或视频的地方调用,故我称之为“内部播放器”。

-------------------------------------------------------


写本教程的目的主要有以下几个方面:

目标1:介绍如何通过代码来控制DirectMediaXtra播放某个具体文件(注意:不是通过DMX的选项设置框来选择播放文件)。

目标2:介绍视频文件的停止、暂停、播放、快进与快退功能是如何通过函数实现的。

目标3:播放进度条的实现方法。



========================
适用对象:

本教程是供初学者参考的,尤其对那些一听到函数、变量、代码等词就色变的Authorware初学者将是极其有效的。
-----------------------------------
为便于描述,我以播放视频文件为例,实际上播放声音文件也一样。

本教程着重介绍实现的方法,故程序的界面比较简单,具体应用时,可以做的更美观一些。

=========================================待续

编辑历史:[此帖最近一次被 dreamexpress 编辑过(编辑时间:2005-08-19 20:11:04)]


dreamexpress_5d

职务:普通成员
等级:1
金币:10.0
发贴:2229
注册:2003/7/2 16:32:57
#22005/8/19 16:47:04
二、构造播放器的程序结构

程序结构(见图二):
图片如下:


程序结构说明:

1、首先拖一个框架图标到流程线上。
2、双击框架图标,然后删除所有的交互按钮,仅保留交互图标。
3、在交互图标前加一个“界面底图”显示图标,准备放播放器的界面底图。
4、在交互图标的右边分别拖4个计算图标,并选择“按钮”交互方式,计算图标内容先保持为空,待以后再写入控制播放的代码。
5、4个按钮分别命名为“播放/暂停”、停止、快进、快退。
-------------------------------------------------------
6、在框架图标的右侧插入一个空白的DirectMediaXtra图标,在对话框中,去掉“启动时显示查找定位对话框”的选项。然后单击确定。不要选择任何播放文件,因为以后我们会用代码来控制这个DirectMediaXtra图标的播放内容。(见图三)
图片如下:

7、为方便起见,将DirectMediaXtra图标的名字改为“dmx”(见图二所示)。

-----------------------------------------
8、“界面底图”显示图标内放置播放器的界面底图,你可以根据需要自己进行设计。为讲解方便,我直接用Authorware的矩形工具画了三个矩形来作为播放器的界面,很朴素也很丑陋,不过本教程是教你如何设计程序,美工不在考虑范围内。(见图四)。
图片如下:


9、界面说明:图中最上面的大矩形将作为视频文件的播放区域,中间的蓝色矩形将作为进度条的显示区域。最下面灰色矩形区域将作为控制按钮的摆放区域。

10、在Authorware中运行程序,按CTRL+P暂停,然后调整各按钮的位置,如图五所示。
图片如下:

编辑历史:[此帖最近一次被 dreamexpress 编辑过(编辑时间:2005-08-19 19:49:37)]


dreamexpress_5d

职务:普通成员
等级:1
金币:10.0
发贴:2229
注册:2003/7/2 16:32:57
#32005/8/19 17:34:42
做了这么多基础工作,我们现在需要保存一下文件。

在Authorware中保存一下文件,保存到一个单独的目录中,文件名任意。
我取的文件名是MediaPlayer.a7p。
-------------------------------------------------------------------
三、通过代码来让DirectMediaXtra播放指定的视频文件[教程目标1]


下面我们先来测试一下,DMX图标能否正常工作。


主要目的是教大家如何用代码来控制DMX播放指定的视频文件。
-----------------------------------
在程序的流程线最开始处拖一计算图标,并命名为“测试”,双击打开这个计算图标准备输入代码。(见图六)
图片如下:

编辑历史:[此帖最近一次被 dreamexpress 编辑过(编辑时间:2005-08-19 19:57:26)]


dreamexpress_5d

职务:普通成员
等级:1
金币:10.0
发贴:2229
注册:2003/7/2 16:32:57
#42005/8/19 17:49:32
之前,你得先准备几个要播放的视频文件,并放到程序的目录中,如果没准备的话,那现在准备吧:
1、在程序所在的目录内建一个子目录,目录名可以任取,我取的名字是Movie。(见图7)

图片如下:

2、在其下放置几个视频文件,我放了3个不同的要播放的文件。(见图8)

图片如下:

编辑历史:[此帖最近一次被 dreamexpress 编辑过(编辑时间:2005-08-19 17:55:53)]


dreamexpress_5d

职务:普通成员
等级:1
金币:10.0
发贴:2229
注册:2003/7/2 16:32:57
#52005/8/19 18:02:17
现在我们继续前面的工作,在“测试”计算图标内输入以下代码:
SetIconProperty(@"dmx",#file,FileLocation^"movie\\M3.MPG")


见下图(图9):

图片如下:


输入完上面的代码后,请关闭计算图标。先不要理会上面的代码是什么意思,我后面会解释的,你要做的就是要保证输入正确。
----------------
在Authorware中运行程序。。。。

编辑历史:[此帖最近一次被 dreamexpress 编辑过(编辑时间:2005-08-19 18:12:08)]


dreamexpress_5d

职务:普通成员
等级:1
金币:10.0
发贴:2229
注册:2003/7/2 16:32:57
#62005/8/19 18:09:41
运行程序后,有没有播放M3.mpg这个视频文件?

-没有任何动静?

---真的没有播放吗?

检查一下输入的代码有没有错误?要不复制一下我上面写的代码,再试着运行一下程序?

--怎么,还没有播放?

嗯,那确实是有点问题了。让我们来检查一下!

打开DMX的选项设置对话框见下图(图十):
图片如下:


看看“数字视频文件”的文本框中是否显示了正确的路径,应该是显示了吧?检查一下,路径和文件名是否正确。

如果检查认为正确的话,那么试着点一下“播放按钮”,看看能否播放。如可以播放,那就对了,否则请检查上面的输入代码,直到在这个对话框内正常播放为止(左上角的预览窗口内应能看到播放内容)。见图十一。
图片如下:

编辑历史:[此帖最近一次被 dreamexpress 编辑过(编辑时间:2005-08-19 18:32:14)]


dreamexpress_5d

职务:普通成员
等级:1
金币:10.0
发贴:2229
注册:2003/7/2 16:32:57
#72005/8/19 18:49:04
经过上面的检查后,请点击“确定”,退出DMX的选项设置对话框。
------------------------------------------------

再次在Authorware中运行程序,看看这次有没有播放。

不错,现在视频文件M3.mpg可以播放了,但屏幕上显示的位置并不正确(见图十二)。

这没有关系,让我们来调整一下!
图片如下:


调整视频播放的位置:
1)按CTRL+P,暂停程序的执行。
2)点击视频,选中它,进行移动和调整大小,你可以通过拖动视频的角点来进行调整。调整的差不多了,再按CTRL+P运行程序,位置还是不大正确,那再按CTRL+P,暂停程序,继续调整,直至满意为止。

视频的位置与大小调整,似乎不那么容易,DMX也太“不听话”了,没办法,这是需要一点耐心与技巧的:先调整大小,差不多了再移动到指定的位置。

慢慢调整啊,我先休息一会儿

下图是我调整好视频位置后的样子:(图十三)
图片如下:


调整完后,再重新运行一次程序,请保证程序运行正确,视频窗口在正确的位置播放。

嗯,我们的测试工作就做完了,但我们还不能控制视频的播放与暂停或停止、快进等。

下面准备编写各控制按钮的代码了。有人一听要写代码就害怕了,其实真的好简单的。
--------------------------

哎,差点忘记了,要解释一下前面那句代码的含义!
SetIconProperty(@"dmx",#file,FileLocation^"movie\\M3.mpg")
是什么意思呢?

相信通过前面的操作,你已知道它的功能了,那就是用代码来播放movie子目录中的M3.mpg文件。

注意,上面的测试中,dmx图标要播放文件并没有直接通过DMX的设置对话框来选择的,那DMX图标是怎么知道要播放的文件在什么地方呢?

--显然就是通过上面这句语句了。实际上在程序运行到DMX图标前,告诉它播放文件的位置就可以了。

这也是这个内部播放器只要设置一个DMX图标的原因,无论有多少个视频文件要播放,仅需要1个DMX图标。



具体解释:
SetIconProperty()函数是设置图属性的函数。

SetIconProperty(@"dmx",#file,FileLocation^"movie\\M3.mpg")

就表示要设置图标"dmx"的file属性,设置好file属性的话,DMX就知道播放哪个具体文件了。

注意:图标名”dmx“要跟在字符"@"后面,"file"前面要有字符"#",表示图标的file属性。

FileLocation^"movie\\M3.mpg"的意思很明确,就是文件的路径与名称:

--FileLocation是Aithorware的系统变量,它保存的是你的程序的路径,
是只读变量,只要你程序运行,它就会自动存储你的文件路径。

"^"是字符串连接符。

FileLocation^"movie\\M3.mpg"就是你要播放的文件位置和名字了。这下明白了吧。






至此,教程的目标1就完成了,感觉怎么样?

相当简单吧,让我们继续下面的目标。你准备好了吗?

编辑历史:[此帖最近一次被 dreamexpress 编辑过(编辑时间:2005-08-29 17:46:52)]


dreamexpress_5d

职务:普通成员
等级:1
金币:10.0
发贴:2229
注册:2003/7/2 16:32:57
#82005/8/19 19:17:39
四、通过代码来控制DirectMediaXtra对视频文件的播放,以实现播放器的停止、暂停、播放、快进与快退功能][教程目标2]

1)停止功能的实现:

停止功能的意思是使得正在播放的视频文件,停下来,并且下次播放时,从头开始播放。这一点是与“暂停”功能不同的,请大家注意观察一下WINDOWS自带的播放器,来感觉一下“停止”与“暂停”的区别。(暂停功能的意思是使得正在播放的视频文件,停下来,并且再次播放时,是从停下来的地方继续播放。)

停止:要实现2个目标,即“停播”与“归零”。

函数语句:
CallSprite(@"DMX", #videoseek, time)


就可以实现我们所要的停止功能。它的意思是让DMX调用#videoseek方法,来搜索到某一时间点time,并且自动暂停视频文件的播放。

要实现停止功能,只需videoseek到时间0的位置就行了。

操作步骤:双击“停止”按钮的下挂计算图标,并在其中输入下面的语句即可:
CallSprite(@"DMX", #videoseek, 0)


见图十四:

图片如下:


关闭计算图标,在Authorware中运行程序,动画开始自动播放,这时点击”停止“按钮测试一下停止功能。嗯,动画文件果然停止了,并且是停在了动画的开始位置。OK,停止功能实现了。 就这么简单!


--------------------------------------------------------------------------------------------------------------------
[注意:]以下的教程是供大家认识DMX函数和提高应用DMX函数的水平例子,不是做”停止“功能必需的知识,入门者或不感兴趣的人可以跳过不学。

我们再来给停止按钮增加一个”功能“:

其实我认为停止按钮不应该总是可用的,如果动画文件本身就是停止的,应禁用”停止“功能,动画都已停止了,再按“停止”有什么意义?让我们来禁止它!

(实际上即使不禁用“停止”按钮,也没什么关系,只是用户点击它时,不会有任何的反应。用户点击它根本毫无意义。呵呵,话说回来,也没什么坏处。

如何判断动画是停止的呢?还记得前面我解释释的”停止“的含义吗?
停止意味着,动画处于未播放状态,并且播放位置在起始处。

播放状态这样来取得:
resultA=GetSpriteProperty(@"DMX",#mediabusy)


上面这条语句”=“是赋值的意思,”=“左边的resultA是个自定义的变量(你可以随便取一个你喜欢的名字),右边是个函数,该函数的意思就是获取DMX是否正在播放动画。如果DMX正在播放动画的话,它会返回TRUE,此时resultA的值就是TRUE,如果DMX没有播放动画,即动画正处于暂停状态(或者停止状态)时,该函数会返回FALSE,此时resultA的值就是FALSE。我们根据resultA的值就可以确定DMX的播放状态。

当前的播放位置这样取得:
resultB=GetSpriteProperty(@"DMX",#currenttime)

同样,resultB是个自定义变量,"="右边的函数就是取得DMX当前播放时间(或者说播放位置)的函数,它的返回值就是当前正在播放的时间位置(它是以毫秒为单位的,使用时要除以1000,才是秒!要注意啊!),该返回值将赋给变量resultB,由变量resulB的值就可以确定出当前正在播放的时间位置。

因此,当DMX处于停止状态时,resultA=FALSE并且resultB=0
因此,当DMX处于播放状态时,resultA=True(resultB可以为0与动画长度间的任何值)。

双击”停止“按钮下挂的计算图标,在已有的代码下面增加以下代码:

resultA=GetSpriteProperty(@"DMX",#mediabusy)
resultB=GetSpriteProperty(@"DMX",#currenttime)

图十五:

图片如下:


然后关闭该计算按钮,此时会分别弹出"自定义变量"对话框,按下图分别给出初始值。
图十六:

图片如下:

图片如下:


resultA的初始值给的是TRUE,resultB的初始值给的是0.这是因为开始时动画是从0位置播放的。给的初始值正好是这种状态。

双击“停止”按钮,打开它的属性设置对话框,点击对话框中的“响应”标签,找到“激活条件”文本框,在其中输入以下代码:

resultA|resultB<>0




这一行代码的意思就是如果动画在播放或者暂停在非起始位置就让“停止“按钮可用。如果不满足上面的条件,就表示DMX是处于停止状态,这时禁用“停止”按钮。
见下图(图十七:):


图片如下:


在Authorware中运行程序进行测试:
一开始“停止”按钮是可用的,这是因为resultA和resultB取的是初始值,这时表示动画是处于非停止状态的!
见下图(图十八):


图片如下:


点一下“停止”按钮,这时动画停止不播放了,同时“停止”按钮也不可用了(灰色)。
见下图(图十九):


图片如下:


OK~,这个提高教程就写完了。从这里我们学会了以下几点:
1)如何确定DMX是否正在播放文件。
2)如何取得DMX的播放(时间)位置。
3)如何根据条件,使用自定义的变量来设置按钮的禁用或者可用(激活)。

-------------------------------------
再次申明,这是个提高教程,是为了让大家学会一些DMX的函数、应用技巧和方法。目的是为了开拓大家的思路,切勿不理解就照抄代码。

我想要是初学者能真的明白本提高教程的话,那一定会受益不浅的。 (不是我自卖自夸吧,呵呵)

-----------------------------------

今天就写到这里了,以后再继续。

编辑历史:[此帖最近一次被 dreamexpress 编辑过(编辑时间:2005-08-29 21:31:33)]


dreamexpress_5d

职务:普通成员
等级:1
金币:10.0
发贴:2229
注册:2003/7/2 16:32:57
#92005/8/19 19:18:20
占位---待续



dreamexpress_5d

职务:普通成员
等级:1
金币:10.0
发贴:2229
注册:2003/7/2 16:32:57
#102005/8/19 19:18:45
占位---待续



dreamexpress_5d

职务:普通成员
等级:1
金币:10.0
发贴:2229
注册:2003/7/2 16:32:57
#112005/8/19 19:19:13
占位---待续



dreamexpress_5d

职务:普通成员
等级:1
金币:10.0
发贴:2229
注册:2003/7/2 16:32:57
#122005/8/19 19:19:37
占位---待续



dreamexpress_5d

职务:普通成员
等级:1
金币:10.0
发贴:2229
注册:2003/7/2 16:32:57
#132005/8/19 19:20:36
占位---待续



dreamexpress_5d

职务:普通成员
等级:1
金币:10.0
发贴:2229
注册:2003/7/2 16:32:57
#142005/8/19 19:46:49
占位---待续



dreamexpress_5d

职务:普通成员
等级:1
金币:10.0
发贴:2229
注册:2003/7/2 16:32:57
#152005/8/24 12:09:05
没人感兴趣还是这贴子没价值?