Win2000网络多媒体应用(二)--ASF流播放器
李学明| 流媒体世界| 2001-03-15

Windows Media Player--ASF流播放器 <br> <br> Windows Media Player是Microsoft公司提出的流播放方案 Media Service 的重要组成部分,是一个通用的媒体播放器。在Media Service解决方案中,Media Player是作为客户端流播放应用程序来使用的。事实上,Media Player既可以象一个普通的应用程序一样单独使用,播放本地或网络上的流信息;也可以由HTML文本中的超级连接来启动以播放流信息;它还可以作为一个ActiveX对象在Web页面中使用。Media Player作为一个通用的媒体播放器除了播放ASF格式的流信息之外,它还可以播放多种格式的媒体信息,包括:声音文件(.wav, .snd, .aif, .au, .mp3),MIDI文件(.mid, .rim, .midi),图象文件(.mov, .avi, .qt. .wmv, .mpg, .mpeg, m1v), 播放列表文件(.asx, .wax, .m3u)等。目前Media Player已经集成在Microsoft的IE5.0中,如果要在Netscape 或低版本的IE中使用Media Player则需要安装,用户可以在Microsoft的www.windowsmedia.com上去免费下载。Media Player的工作界面如图1 所示。下面我们将对Media Player的使用做详细的介绍。首先我们要简单地介绍如何将Media Player作为一个独立的应用程序来使用,以及如何在HTML建立hyperlink以启动Media Player。然后着重介绍如何在Web页中将Media Player作为一个ActiveX对象来使用,并用JavaScript对其工作过程进行控制。 <br> <br> 图 1 Media Player的工作界面 <br> 1 将Media Player作为独立使用的应用程序 <br> 将Media Player做为一个独立的应用程序的使用比较简单,只要在File菜单中选择Open,然后输入或选择要播放的文件就可以对该文件进行播放。如图2所示。如果要播放Media Server上广播的节目,可以在Open对话框中输入mms://IP_address/station_name 即可以直接播放Server上播放的节目。其中IP_address是Media Server的地址,而station_name是节目的站名。 <br> <br> 图2 用Media Player直接播放ASF文件 <br> <br> 2 利用ASX文件在HTML启动Media Player <br> 打开Media Player的另一种方式是用HTML中超级连接,这需要用一个ASX文件来辅助完成该工作。ASX(Advanced Stream Redirector)文件是一个文本文件,它主要的目的对流信息重定向。在ASX文件中包含了媒体内容对应的的URL(Uniform Resource Locator),当我们在HTML中让一个hyperlink 与ASX联系时,浏览器会直接将ASX的内容送给Media Player,Media Player会根据ASX文件的信息用相应的协议去打开指定位置上的多媒体信息流或多媒体文件。 <br> <br> 利用ASX文件来重定向流信息的主要原因是:目前通用的浏览器通常均不能直接支持用于播放流信息的协议,如Microsoft 的Media Server protocol (MMS) or Microsoft? NetShow? Theater Server protocol。它们通常支持的协议是HTTP,FTP等协议。因此如果我们在HTML 文件中链接是http://www.microsoft.com,目前所有的浏览器均能用HTTP协议与一个WWW服务器建立连接。相反,如果我们需要一个Media Server建立连接以播放流信息,就必须用MMS协议,如mms://202.112.107.59/station1,但由于目前通用的浏览器通常均不能直接支持MMS协议,所以浏览器不能与Media Server建立连接。为了解决这个问题,必须采用ASX文件。采用ASX文件后,当浏览器发现一个连接与ASX有关时,它知道需要用Media Player来播放流信息,于是它会自动启动Media Player,并将ASX文件的信息送给Media Player,Media Player就可以用如MMS之类的协议来播放流信息了。 ASX文件是单纯的文本文件,我们可以用任何文本编辑器来编辑生成,但扩展名必须是.asx。下面给出了一个ASX文件的例子。 <br> <asx version = "3.0"> <br> <title>demo</title> <br> <entry> <br> <ref href = "mms://202.112.107.59/demo/demo.asf"/> <br> </entry> <br> </asx> <br> 第一行是版本号,第二行是标题,在<entry></entry>之间的部分说明Media Player应用MMS协议去播放网络计算 202.112.107.59上demo路径下的demo.asf文件。 <br> ASX文件可以有自己的TITLE,AUTHOR,COPYRIGHT之类的信息,它的<entry></entry>可以有多个,表示有多个流要播放,这被成为播放列表,每个<entry></entry>之间还有属于每个流的相关信息包括TITLE,AUTHOR,COPYRIGHT等。下面的例子中就有两个节目要播放,它们各自还有自己的信息。 <br> <ASX VERSION="3.0"> <br> <TITLE>Example Media Player Show</TITLE> <br> <AUTHOR>Windows Media Technologies</AUTHOR> <br> <COPYRIGHT>(c) 1999, Microsoft Corporation</COPYRIGHT> <br> <br> <ENTRY> <br> <TITLE>Example Clip</TITLE> <br> <AUTHOR>Windows Media Technologies</AUTHOR> <br> <COPYRIGHT>(c) 1999, Microsoft Corporation</COPYRIGHT> <br> <REF HREF="mms://samples.microsoft.com/media.asf" /> <br> </ENTRY> <br> <br> <ENTRY> <br> <TITLE>Another Clip</TITLE> <br> <AUTHOR>Windows Media Technologies</AUTHOR> <br> <COPYRIGHT>(c) 1999, Microsoft Corporation</COPYRIGHT> <br> <REF HREF="mms://samples.microsoft.com/more_media.asf" /> <br> </ENTRY> <br> </ASX> <br> 在HTML使用ASX文件的方法非常简单,与建立一个普通的HyperLink的方法相同。下面是一个简单的HTML文件testasx.htm,它给出了与ASX文件的链接。 <br> <html> <br> <head> <br> <meta http-equiv="Content-Type" content="text/html; charset=gb2312"> <br> <title>Test ASX File</title> <br> </head> <br> <body> <br> <p><a href="http://202.112.107.59/broadcast/station.asx">Test ASX</a></p> <br> </body> <br> </html> <br> 除了用户自己创建ASX文件之外,更简单的办法是由Media Server来自动创建。当我们希望用Media Server来播放流信息时,我们必然要对播出的节目流进行设置,比如指定流文件名,指定播放协议等。在设置完成时Media Server会根据用户的设置自动建立一个ASX文件,利用该ASX文件Media Player 就可以播放Media Server播放的节目流。我们可以直接利用这个ASX文件与HTML建立链接,而不需要用户自己去书写ASX文件。 <br> <br> 3 在Web页中使用Media Player <br> 虽然上面两种方法均能完成流信息的播放,但不足之处是播放是在独立的窗口中进行的。比如在HTML通过与ASX文件的链接可以打开并播放流信息,但流信息的播放是在另一个窗口即播放器窗口中进行的,播放的控制也需要在播放器窗口中来完成。幸运的是Media Player是一个标准的ActiveX控件,我们可以将它作为一个对象直接嵌入到HTML页中去,这样就可以在Web页中直接用Player对象来播放流节目。图3是一个将Player嵌入Web页的例子。 <br> <br> 图 3 将Media Player嵌入到Web 页中 <br> 在Web页中嵌入Media Player的方法比较简单,只要用HTML中的<Object></Object>可以了,如下所示。 <br> <OBJECT ID="WMPlay" WIDTH=320 HEIGHT=240 <br> CLASSID="CLSID:22D6f312-B0F6-11D0-94AB-0080C74C7E95" <br> CODEBASE="http://activex.microsoft.com/activex/controls/mplayer/en/ <br> nsmp2inf.cab#Version=6,4,5,715" <br> STANDBY="Loading Microsoft? Windows Media? Player components..." <br> TYPE="application/x-oleobject"> <br> </OBJECT> <br> 其中ID是对象的名称,当用户在JavaScript要对Media Player进行控制时可以用该对象的名称WMPlay进行访问。CODEBASE指明当用户的浏览器中没有安装Player控件时可以从该URL指定的位置去获取。 <br> 当然在建立Player对象时也可以用<PARAM >来为其指定参数。如下所示: <br> <PARAM NAME="FileName" VALUE="C:ASFRootWelcome.asf"> <br> <PARAM NAME="ShowControls" VALUE="False"> <br> <PARAM NAME="AutoRewind" VALUE="True"> <br> <PARAM NAME="AutoStart" VALUE="False"> <br> 其中"FileName"参数表示Media Player要播放的文件活或流。"ShowControls"表示在播放时是否显示控制条。Media Player的参数很多,我们在此不再一一详述。读者如果需要了解更详细的内容可以参考Media Player SDK中的相关部分。 <br> 如果用户需要对Media Player进行控制可以用JavaScript进行控制。图4给出了用JavaScript对Media Player进行控制的例子。 <br> <br> 图4 用JavaScript控制Media Player的例子 <br> 在这个例子中,Media Player嵌入在Web页面中,在Media Player右边有一些按钮,利用这些按钮用户可以控制Media Player的播放活动。这些按钮的HTML代码如下: <br> <form name="myform"> <br> <input type="button" width="15" value="No Controls " name="NoControls" <br> OnClick="controlType(false)"> <br> <input type="button" width="15" value="All Controls" name="Full" <br> Onclick="controlType(true)"> <br> <input type="button" width="15" value=" Small " name="Small" <br> OnClick="displaySize(1)"> <br> <input type="button" value=" Large " name="Large" <br> Onclick="displaySize(2)"> <br> <input type="button" width="15" value=" Normal " name="Normal" <br> Onclick="displaySize(0)"> <br> <input type="button" width="15" value=" Play " name="Play" <br> Onclick="PlayClick()"> <br> <input type="button" width="15" value=" Stop " name="Stop" <br> Onclick="StopClick()"> <br> </form> <br> 相应的JavaScript代码为: <br> <script language="javascript"> <br> <!-- <br> var g_Browser = navigator.appName; <br> function controlType (setting) <br> { <br> if (g_Browser == "Netscape") <br> document.WMPlay.SetShowControls(setting); <br> else <br> document.WMPlay.ShowControls = setting; <br> } <br> function displaySize (setting) <br> { <br> if (g_Browser == "Netscape") <br> document.WMPlay.SetDisplaySize(setting); <br> else <br> document.WMPlay.DisplaySize = setting; <br> } <br> function PlayClick () <br> { <br> document.WMPlay.Play(); <br> } <br> function StopClick () <br> { <br> document.WMPlay.Stop(); <br> if (g_Browser == "Netscape") <br> document.WMPlay.SetCurrentPosition(0); <br> else <br> document.WMPlay.CurrentPosition = 0; <br> } <br> function PauseClick () <br> { <br> document.WMPlay.Pause(); <br> } <br> function PlayPauseClick () <br> { <br> var state; <br> if (g_Browser == "Netscape") <br> state = document.WMPlay.GetPlayState(); <br> else <br> state = document.WMPlay.PlayState; <br> if (state == 0) <br> document.WMPlay.Play(); <br> else if (state == 1) <br> document.WMPlay.Play(); <br> else if (state == 2) <br> document.WMPlay.Pause(); <br> <br> } <br> //--> <br> </script> <br> 从这个例子可以看出当用户单即其中的某个按钮时,它对应的OnClick函数将被调用。在JavaScript函数中,可以直接用WMPlay来控制播放器的活动,比如开始播放,停止播放或占停播放,以及放大缩小等。 <br> 除了可以用动作比如鼠标的动作来对嵌入的Media Player进行控制外,还可以利用事件来对其进行控制。Microsoft? Windows Media? Player 支持的事件很多,有普通的鼠标事件,比如鼠标的单击、双击、鼠标的移动、鼠标键的按下与松开等,也有一些是Media Player特有的事件。与流播放有直接关系的事件有:OpenStateChange,PlayStateChange,Buffering,MarkerHit,ScriptCommand等。下面我们对这几个重要的事件做简单地介绍。 <br> <br> 1 OpenStateChange 事件 <br> OpenStateChange 事件表示Player的状态已经发生了改变。Media Player的打开状态有: <br> 0 表示流已经关闭(nsClosed) <br> 1 表示正在装入ASX文件(nsLoadingASX) <br> 2 表示正在装入NSC文件(nsLoadingNSC) <br> 3 表示正在寻找Media Server (nsLocating) <br> 4 表示正在与Media Server建立连接(nsConnecting) <br> 5 表示正在打开或侦听流信息(nsOpening) <br> 6 表示流信息已经打开(nsOpen) <br> 用JavaScript处理OpenStateChange事件的格式如下: <br> <SCRIPT FOR="MediaPlayer" EVENT="OpenStateChange(lOldState, lNewState)" <br> LANGUAGE="JScript"> <br> //insert script commands// <br> </SCRIPT> <br> 其中MediaPlayer是在<OBJECT></OBJECT>中定义的Media Player对象时的名字。 <br> <br> 2 PlayStateChange 事件 <br> PlayStateChange 事件表示Media Player的播放状态已经改变,Media Player可能的状态有: <br> 0 播放已经停止(mpStopped) <br> 1 播放暂停(mpPaused ) <br> 2 正在播放(mpPlaying) <br> 3 正在等待流开始(mpWaiting) <br> 4 向前搜索(mpScanForward) <br> 5 向后搜索(mpScanReverse) <br> 6 向前跳跃(mpSkipForward) <br> 7 向后跳跃(mpSkipReverse) <br> 8 流已经关闭(mpClosed) <br> 用JavaScript处理该事件的方法为: <br> <SCRIPT FOR="MediaPlayer" EVENT="PlayStateChange(lOldState, lNewState)" <br> LANGUAGE="JScript"> <br> //insert script commands// <br> </SCRIPT> <br> <br> 3 Buffering 事件 <br> Buffering事件表示Media Player正在缓冲数据准备播放。在进行流播放之前,Media Player必须要缓冲一定数量的数据之后才开始播放,Buffering事件反映了Player缓冲数据的状况。用JavaScript处理Buffering事件的方法为: <br> <SCRIPT FOR="MediaPlayer" EVENT="Buffering(bStart)" LANGUAGE="JScript"> <br> //insert script commands// <br> </SCRIPT> <br> 其中bStart为一个布尔变量,当它为TRUE时表示缓冲正在进行,反之表示缓冲已经结束。 <br> <br> 4 ScriptCommand 事件 <br> ScriptCommand事件表示Media Player接收到了Script 命令,这时用户可以利用对接收到Script命令进行分析以决定采取相应的处理。我们知道利用Media Tools的ASF Indexer工具可以给流添加Script命令,当流播放器Player接收到这些Script 命令时会激活这个事件处理方法,于是用户可以在事件处理方法中对Script命令进行处理。处理ScriptCommand的方法是: <br> <SCRIPT FOR="MediaPlayer" EVENT="ScriptCommand(sType, sParam)" <br> LANGUAGE="JScript"> <br> //insert script commands// <br> </SCRIPT> <br> 其中sType是Script命令的类型,Script命令的类型有URL,TEXT,EVENT等,用户可以根据Script命令类型的不同做不同的处理。比如,如果是URL命令,我们可以在指定的帧内打开sParam中指定的页面。 <br> <br> 5 MarkHit 事件 <br> MarkerHit事件同ScritpCommand事件一样,当媒体播放器在ASF流中遇到标记时会激活该事件,用户利用该事件可以知道当前的标记是第几个标记。MarkerHit事件的处理方法是: <br> <SCRIPT FOR="MediaPlayer" EVENT="MarkerHit(lMarkerNum)" LANGUAGE="JScript"> <br> //insert script commands// <br> </SCRIPT> <br> 当然,除了支持事件处理之外,做为一个ActiveX对象,Media Player还有很多的属性(Property)和方法(Method)可以供Web页使用。比如用MediaPlayer.MarkerCount 属性可以知道在ASF流中到底有多少个标记;利用MediaPlayer. CurrentPosition属性可以知道当前播放位置的时间等等。至于Media Player对象的方法我们在前面已经使用了很多,比如Play(), Pause()等均是Media Player的方法。由于Media Player对象的属性和方法太多,我们不可能在此一一介绍,而只是对几个较为重要的事件处理做了一定的介绍。用户在使用时可以参考Media Player SDK的帮助文档以获取更多的信息。 <br> 本文对Media Service的客户应用程序Media Player的使用,特别是在Web页中的使用做了简单的介绍。作为一个通用的媒体播放器,它还有很多的功能这里没有介绍,要了解一个软件的功能,最好的方法就是使用它。用户如果感兴趣可以从www.windowsmedia.com上去免费下载。(北京邮电大学信息工程系 李学明) 

责任编辑:lmtwadmin

分享到:
版权声明:凡注明来源“流媒体网”的文章,版权均属流媒体网所有,转载需注明出处。非本站出处的文章为转载,观点供业内参考,不代表本站观点。文中图片均来源于网络收集整理,仅供学习交流,版权归原作者所有。如涉及侵权,请及时联系我们删除!