hetemlのFMS(FlashMediaServer)にAS3でビデオキャスト

今月中頃にリモートライブを企画しておりまして、その為の準備として、手始めにhetemlのFMS(FlashMediaServer)でビデオキャストしてみた。そしたら案の定躓いたのでメモ。

hetemlさんの「WEBカメラからの映像配信マニュアル」には親切なことにflaファイルまで含めたサンプルがおいてあるんだけど、残念ながらAS2でコーディングされている。これじゃあ「samplesCallback」とか使えないのでAS3で作ってみた。

ポイントは2カ所。

 nc.objectEncoding = ObjectEncoding.AMF0;
AS2の時は上記の指定は必要なかったけど、AS3だと必須みたいで、明示的に指定しないと接続できない。

 Video.attachNetStream();
こちらはAS2のときは「attachVideo()」でよかったんだけど、AS3では「ストリーミングですよ!」って感じのメソッドに変更されている。



とりあえずはビデオ配信の為だけど、今後色々とFMSを使った企画を考えてみたいと思います。了

参考サイト Flash Media Server 2メモ

ソースはこちら *Sender.asが配信側で Receiver.asが受信側

Sender.as package {
    import flash.display.Sprite;
    import flash.display.StageAlign;
    import flash.display.StageScaleMode;
    import flash.events.*;
    import flash.media.Camera;
    import flash.media.Video;
    import flash.net.NetConnection;
    import flash.net.NetStream;
    import flash.net.ObjectEncoding
    import flash.text.TextField;

    public class Sender extends Sprite {

        //rtmp://サーバー名/アプリ名/{任意}インスタンス名    
        private var PATH_FMS:String = "rtmp://foo.fms.heteml.jp/watch"

        private var camera:Camera
        private var video:Video;
        private var nc:NetConnection;
        private var ns:NetStream

        private var textField:TextField

        public function Sender() {

            stage.scaleMode = StageScaleMode.NO_SCALE;
            stage.align = StageAlign.TOP_LEFT;

            init();

        }


        private function init():void{

            //debug用にテキストフィールド生成
            textField=new TextField();
            textField.text="FMSConnectEx";
            addChild(textField);

            textField.y = 300
            textField.width = 400

            //カメラのセットアップ
            setCamera();

            //ネットワーク接続
            connectFMS();

        }

        //カメラのセットアップ
        private function setCamera():void{

            camera = Camera.getCamera();

            if (camera != null) {
                video = new Video(camera.width, camera.height);
                video.attachCamera(camera);
                addChild(video);
            } 

        }


        //ネットワーク接続
        private function connectFMS():void{

            nc = new NetConnection();

            //AMF設定!
            nc.objectEncoding = ObjectEncoding.AMF0;

            nc.addEventListener(NetStatusEvent.NET_STATUS,onNetStatus);

            nc.connect(PATH_FMS);
        }

        //ネットワーク接続イベント
        private function onNetStatus(e:NetStatusEvent):void {

            textField.text = "" + e.info.code;

            if (e.info.code == "NetConnection.Connect.Success"){
                //ストリーム送信
                sendStream();
            }

        }


        //ストリーム送信
        private function sendStream():void{

            ns = new NetStream(nc)

            ns.attachCamera(camera)
            ns.publish("video")

            ns.addEventListener(NetStatusEvent.NET_STATUS,
                function(e:NetStatusEvent):void{
                    textField.appendText(e.info.code)
                })
        }

    }
}


Render.as package  {

    import flash.display.Sprite;
    import flash.display.StageAlign;
    import flash.display.StageScaleMode;
    import flash.events.*;
    import flash.media.Camera;
    import flash.media.Video;
    import flash.net.NetConnection;
    import flash.net.NetStream;
    import flash.net.ObjectEncoding
    import flash.text.TextField;

    public class Receiver extends Sprite {

        //rtmp://サーバー名/アプリ名/{任意}インスタンス名        
        private var PATH_FMS:String = "rtmp://foo.fms.heteml.jp/watch"

        private var camera:Camera
        private var video:Video;
        private var nc:NetConnection;
        private var ns:NetStream

        private var textField:TextField

        public function Receiver() {

            stage.scaleMode = StageScaleMode.NO_SCALE;
            stage.align = StageAlign.TOP_LEFT;

            init();

        }

        private function init():void {

            textField=new TextField();
            textField.text="FMSConnectEx";
            addChild(textField);

            textField.y = 300
            textField.width = 400

            video = new Video()
            addChild(video)

            //ネットワーク接続
            connectFMS();

        }

        //video受信
        private function receiveVideo():void{

            ns = new NetStream(nc)
            ns.play("video");

            //videoに直接ストリームをattach
            video.attachNetStream(ns)

            ns.addEventListener(NetStatusEvent.NET_STATUS,
                                function(e:NetStatusEvent):void{
                                    textField.appendText(e.info.code)
                                })

        }

        //ネットワーク接続
        private function connectFMS():void{

            nc = new NetConnection();

            nc.objectEncoding = ObjectEncoding.AMF0;
            nc.addEventListener(NetStatusEvent.NET_STATUS,onNetStatus);

            nc.connect(PATH_FMS);
        }

        //ネットワーク接続イベント
        private function onNetStatus(evt:NetStatusEvent):void {
            textField.text = "" + evt.info.code;
            if (evt.info.code == "NetConnection.Connect.Success"){
                //video受信
                receiveVideo();
            }
        }

    }
}

powerd by as2html

Trackback

http://memo.kappa-lab.com/mt-tb.cgi/223

Leave your comment :

(いままで、ここでコメントしたことがないときは、コメントを表示する前に承認が必要になることがあります。そのときはしばらくお待ちください。)




RSS + Contuct

  • rss
  • email

Credit

Copyright (C) 2007 kappa-lab.com.
All Rights Reserved.