第二十六章
5.6.4 播放進度條的實現邏輯
按鈕的邏輯已經完成,現在我們開始討論播放進度條的實現邏輯。
首先需要知道當前播放的視頻文件的總長度,這裏我們可以使用Red5的ApplicationAdapter對象的public方法getStreamLength來實現。
定義一個Number類型的全局變量streamLength,來保存視頻的總長度:
var streamLength: Number;
當視頻流開始播放後,我們利用NetConnection對象調用Red5服務器端的getStreamLength方法來獲得視頻流的長度,注意這裏我們需要使用Responder對象作為回調容器來接收服務器端方法返回的值。
定義一個Responder類型的全局變量ncRes:
var ncRes:Responder;
然後在NetStream開始播放後獲取視頻流的長度,注意這裏我們需要給Responder對象綁定一個回調函數onResult,用來獲得服務器端的返回值:
ns =new NetStream(nc);
ns.addEventListener(NetStatusEvent.NET_STATUS, nsNetStatus);
ns.play ("rtmp://192.168.1.4/videoapp/test");
ncRes = new Responder(onResult);
nc.call("getStreamLength", ncRes, "test" );
function onResult(result:Object)
{
streamLength = Number(result.toString());
}
獲得視頻流長度後,下一步需要跟蹤當前的NetStream的播放進度和播放情況,我們將使用NetStream的兩個事件onMetaData和onPlayStatus。注意:這兩個事件的調用必須通過回調對象client來完成。
指定NetStream的client對象為當前Fla文件:
ns.client = this;
聲明兩個public 函數onMetaData和onPlayStatus:
public function onMetaData(info:Object)
{
//to do...
}
public function onPlayStatus(info:Object)
{
//to do...
}
在事件onMetaData裏,我們可以通過傳遞對象的一些屬性來了解播放流的情況,事件onMetaData的屬性如表5-4所示。
表5-4 事件onMetaData的屬性