Handling Callback Events From RealPlayer

来源:互联网 发布:明治奶粉淘宝 编辑:程序博客网 时间:2024/05/18 06:28

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=text
End 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;

原创粉丝点击