深入淺出 Flash Media Server (RTMP)介紹 part V – Play & Stream

[這段程式碼僅供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

本篇發表於 FlashMediaServer 與標籤於 anistar固定網址書籤。
本文引用:
文章內容為ANISTAR BLOG所有,引用分享請以鏈結形式註明出處與原始作者。

關於 anistar

現任:台灣區 Yahoo! 專長: Objective C、iOS SDK、Android SDK、Flex 4、RIA、ActrionScript 3、HTML5、CSS3、JQuery、JQuery Mobile、C++、PHP、MySQL...等整合運用。 著作:《Run!PC雜誌》專欄作家、《CADesigner雜誌》專欄作家、《Flash CS3 Professional ActionScript 3.0 打造互動設計力與美》、《新一代互動體驗Flex+AIR程式開發》。 認證:Macromedia Certified Instructor in ColdFusion    Adobe Certified Expert in Photoshop    Adobe Certified Instructor in Flex

15 則迴響於“深入淺出 Flash Media Server (RTMP)介紹 part V – Play & Stream

  1. 請問一下~~~
    我照寫了你的code…執行的時候他會出錯
    TypeError: Error #1009: Cannot access a property or method of a null object reference.
    at Test/statusHandler()

    swf上也沒有播影片…

    我是把package{} 裏的東西save成了class,再在fla裏new這個class
    會不會是streamVideo這個東西我沒宣告呢?
    謝謝解答~

  2. Dear XYZ:

    串流模式是不用這兩個屬性的,在Flash的中文翻譯中的確是寫"串流",但是我認為那是翻譯上的筆誤,若是要認真去探討,我倒是建議那個翻譯是用"漸進式"會比較恰當。

  3. 请教一下,我按照作者您的方式,对程序稍微的做了修改,结果视频文件播放不出来了,其中的cs3文件我已经放置在作者说的路径下,请作者帮我看一下是什么问题,代码如下
    package {
    import flash.display.Sprite;
    import flash.events.NetStatusEvent;
    import flash.events.SecurityErrorEvent;
    import flash.media.Video;
    import flash.net.NetConnection;
    import flash.net.NetStream;
    import flash.events.Event;
    import flash.net.ObjectEncoding;

    public class Main142 extends Sprite {
    private var videoURL:String = “cs3.flv";
    private var connection:NetConnection;
    private var stream:NetStream;

    public function Main142() {
    connection = new NetConnection();
    connection.objectEncoding = ObjectEncoding.AMF0;
    connection.connect(“rtmp://192.168.1.7/firstMedia/streams/connector");
    connection.addEventListener(NetStatusEvent.NET_STATUS, netStatusHandler);
    connection.addEventListener(SecurityErrorEvent.SECURITY_ERROR, securityErrorHandler);

    }

    private function netStatusHandler(event:NetStatusEvent):void {
    switch (event.info.code) {
    case “NetConnection.Connect.Success":
    connectStream();
    break;
    case “NetStream.Play.StreamNotFound":
    trace(“Stream not found: " + videoURL);
    break;
    }
    }

    private function securityErrorHandler(event:SecurityErrorEvent):void {
    trace(“securityErrorHandler: " + event);
    }

    private function connectStream():void {
    var stream:NetStream = new NetStream(connection);
    stream.addEventListener(NetStatusEvent.NET_STATUS, netStatusHandler);
    stream.client = new CustomClient();
    var video:Video = new Video();
    video.attachNetStream(stream);
    stream.play(“cs3.flv");
    addChild(video);
    }
    }
    }

    class CustomClient {
    public function onMetaData(info:Object):void {
    trace(“metadata: duration=" + info.duration + " width=" + info.width + " height=" + info.height + " framerate=" + info.framerate);
    }
    public function onCuePoint(info:Object):void {
    trace(“cuepoint: time=" + info.time + " name=" + info.name + " type=" + info.type);
    }
    }

發表迴響

你的電子郵件位址並不會被公開。 必要欄位標記為 *