Handling Callback Events From RealPlayer

    技术2022-05-11  79

    Form: http://www.voidclass.com/PermaLink,guid,854ccf18-1516-4b81-9390-9187f4619d70.aspx

    我有个习惯。喜欢在计算机上播放一段音乐或评书,然后躺在床上,在饱满听觉享受中进入梦香。

    前一段时间我找到一个免费在线收听评书的网站。无论从内容还是速度上都比较满意,但是没有连续收听的功能。一段评书播放完了,我还没睡着呢。郁闷!! :(

    于是着手解决这个网站连续播放的问题。

    方法很简单,在播放器播放结束的时候,打开“下一页”超链接所指定的网址就可以进入下一段评书的播放了。

    那么有三个问题需要解决:1) 捕获播放器播放结束事件;2) 获取“下一页”超链接所指定的地址;3) 将我的脚本程序插入到网页中,并执行。

    第一个问题:该网站使用的是RealPlayer播放器,我在Google上找了一下,关于RealPlayer的资料大多是一些如何加密和控制播放器等等。还好最后在RealNetworks官方网站找到了有RealPlayer事件捕获的资料。(Embedded RealPlayer Extended Functionality Guide)

    可使用如下代码实现:<OBJECT ID=RVOCX CLASSID="clsid:CFCDAA03-8BE4-11cf-B84B-0020AFBBCCFA">  <PARAM NAME="controls" VALUE="all">  <PARAM NAME="SRC" VALUE="http://www.company.com/sample.rpm"></OBJECT><P>Status Text:<input type="text" name="statusText"><br></P><SCRIPT language="VBS">Sub RVOCX_OnShowStatus(byVal text)  statusText.Value=textEnd Sub</SCRIPT>

    RealPlayer并没有直接提供一个播放结束事件,但是RealPlayer提供了OnPlayStateChange和OnStateChange。通过这两个事件可以实现播放结束的捕获。

    OnPlayStateChange定义:OnPlayStateChange(int32 old_state, int32 new_state)参数说明:

    Parameter ValuePlay State0Stopped1Contacting2Buffering3Playing4Seeking5Paused注意:在网页中嵌入RealPlayer有两种方法。可以使用RealPlayer Netscape插件或使用ActiveX控件。前者使用<EMBED>标记,后者使用<OBJECT>标记。当使用ActiveX控件时,old_state参数无效。如果需要在ActiveX控件编程方式下同时使用old_state和new_state两个参数,可以使用OnStateChange事件。

    OnStateChange定义:OnStateChange(int32 old_state, int32 new_state)参数说明:同上。注意:OnStateChange仅适用于ActiveX控件。

    第二个问题:获得“下一页”的链接。不详细说明了,就是HTML分析。

    第三个问题:将我写的脚本插入网页。可以通过IE提供的insertAdjacentHTML方法来实现。注意:在使用insertAdjacentHTML向网页中插入脚本时,一定要在<Script>元素中加入"DEFER"属性。(<SCRIPT DEFER LANGUAGE="VBS">)

    Ok,所有的问题都解决了。新建一个WinForm项目,摆上一个WebBrowser,在OnDocumentComplete中写入代码。

    Code:begin  get & parse html  get "next page" link    // script  <SCRIPT DEFER LANGUAGE="VBS">  Sub (playerid)_OnStateChange(old_state, new_state)    if new_state = 0 & old_state = 3 then      goto "next page" link  End Sub  </SCRIPT>    get player object  player.insertAdjacentHTML('afterEnd', script)end;


    最新回复(0)