2007
07.24


[這段程式碼僅供ActionScript 3.0與Flash Media Server參考]

上次完成了連線,光完成連線應該沒什麼快感吧,這次要嘗試從Flash Media Server上來動態串流播放FLV檔,當然因為要播放的是一個串流的媒體,所以要先準備好一個.flv的影片檔才能播放。

基本上串流是經由NetConnection的連線在傳遞資料,一個NetConnection 可以有多個NetStream,不過一個NetStream只能處理一個媒體,而且只能處理一個方向,這時候你一定覺得什麼叫做方向,老實說我也覺得怪怪的,不過這邊講的方向是指錄製(由Client送往Server)或是播放(由Server送往Client),所以若要要同時錄製與播放,則可以產生兩個NetStream即可,說太遠了,這邊我們示範播放串流就好了,這個CS3.flv被放置在[C:Program FilesMacromediaFlash Media Server 2applicationsfirstMediastreamsconnector]目錄中,firstMedia是應用程式名稱(Apllication Name)而connector是實題名稱(Instance name),示範程式如下:

執行結果如下圖,就可以播放Server上的FLV。


package {
import flash.display.Sprite;
import flash.net.NetConnection;
import flash.events.NetStatusEvent;
import flash.net.ObjectEncoding;
import flash.media.Video;
import flash.net.NetStream;
import flash.events.AsyncErrorEvent;

public class Main142 extends Sprite{

public var nc:NetConnection;
public var in_ns:NetStream;

public function Main142(){
nc = new NetConnection();
nc.objectEncoding = ObjectEncoding.AMF0;
nc.connect("rtmp://127.0.0.1/firstMedia/connector");
nc.addEventListener(NetStatusEvent.NET_STATUS,statusHandler);
}

private function statusHandler(event:NetStatusEvent):void{
if(event.info.code == "NetConnection.Connect.Success"){
in_ns = new NetStream(nc);
in_ns.addEventListener(AsyncErrorEvent.ASYNC_ERROR,errorHandler);
in_ns.addEventListener(NetStatusEvent.NET_STATUS,videoHandler);
streamVideo.attachNetStream(in_ns);
in_ns.play("cs3″)
trace("ok")
}
}

private function errorHandler(event:AsyncErrorEvent):void{

}

private function videoHandler(event:NetStatusEvent):void{
trace(event.info.code);
}

}
}

netStream


相關文章:
  • 深入淺出 Flash Media Server (RTMP)介紹 part VI – 使用WebCam
  • 深入淺出 Flash Media Server (RTMP)介紹 part IV – 建立新連線
  • FLV與NetStram播放完畢判斷 part II
  • FLV與NetStram播放完畢判斷 part I
  • 深入淺出 Flash Media Server (RTMP)介紹 part III
  • 本文引用:
    文章內容由宋志峰[ANISTAR]撰寫,引用分享請以鏈結形式註明出處與原始作者。

    15 comments so far

    Add Your Comment
    1. 請教一下,當我讀入串流時,為什麼串流的byteloaded、bytetotal讀取不到資料?

    2. 等到有時間我會在繼續講 Flash Media Server的內容,當然也包含SSAS。

    3. 不好意思,剛學習,不太懂您的意思,可以給我點提示嗎?!

      請問會試範SSAS語言嗎?

    4. Dear XYZ:
      當然可以偵測頻寬,請搭配Server-Side ActionScript一起使用。

    5. Dear XYZ:

      因為在Flex的底層至少要用UIComponenet,請自行用Flex製做出畫面再參考這篇的示範。

    6. 不好意思,再請問一下,我在看一些串流影片時,有些影片大小一樣,從不同地方下載,但串流速度卻不一樣,是因為AS3裡有方法可以看我有多少頻寬,以決定給多少量嗎?所以頻寬比較慢,就給少一點量!?謝謝

    7. 不好意思,我找到為什麼沒有畫面,我忘了開fms,所以沒畫面,但是開啟fms後,
      出現如下訊息:
      TypeError: Error #1034: 強制轉型失敗: 無法將 flash.media::Video@3697871 轉換成 mx.core.IUIComponent。
      at mx.core::Container/http://www.adobe.com/2006/flex/mx/internal::addingChild()
      at mx.core::Container/addChildAt()
      at mx.core::Container/addChild()
      at connector/::statusHandler()

      可以解釋一下嗎?!謝謝

    8. 不好意思,沒貼到程式碼
      /*
      import flash.display.Sprite;
      import flash.net.NetConnection;
      import flash.events.NetStatusEvent;
      import flash.net.ObjectEncoding;
      import flash.media.Video;
      import flash.net.NetStream;
      import flash.events.AsyncErrorEvent;
      import flash.media.Video;
      import flash.net.*;

      public var nc:NetConnection;
      public var in_ns:NetStream;

      public function Main142():void{
      ll.text="ok";
      nc = new NetConnection();
      nc.objectEncoding = ObjectEncoding.AMF0;
      nc.connect("rtmp://localhost/firstMedia/connector");
      nc.addEventListener(NetStatusEvent.NET_STATUS,statusHandler);
      }

      private function statusHandler(event:NetStatusEvent):void{

      if(event.info.code == "NetConnection.Connect.Success"){
      in_ns = new NetStream(nc);
      in_ns.addEventListener(AsyncErrorEvent.ASYNC_ERROR,errorHandler);
      in_ns.addEventListener(NetStatusEvent.NET_STATUS,videoHandler);

      var streamVideo:Video=new Video(360,240);
      streamVideo.attachNetStream(in_ns);
      in_ns.play("cs3″)
      trace("ok")
      vbox.addChild(streamVideo);

      }
      }

      private function errorHandler(event:AsyncErrorEvent):void{

      }

      private function videoHandler(event:NetStatusEvent):void{
      trace(event.info.code);
      }

      */

    9. Dear XYZ:

      這段Code不是Flex的程式,而是純ActionScript 3.0,若想要用在Flex中要配合MXML才行,不過關鍵的code都在這了。

    10. 新手請多指教,為什麼我測試,打了上面的程式碼,打在Flex2裡
      程式碼如下

      為什麼執行後點了按鈕後沒有畫面,謝謝