Actionscriptの記述

Wowzaのインストールや設定方法は、このサイトのWowza記事を読んでもらえればと思います。なので、もういきなりActionscriptの話に入っちゃいます。

基本的には、ビルトインクラスを使用して、作っていくのですが、ポイントはストリーミングサーバーを利用する場合も、ローカルのFLVやMP3を使う場合も、方法は同じということです。
以外に思われるかも知れませんが、要はストリーミングサーバーを使用する場合は、そのアドレスを、そうでない場合は何も指定しないのです(正確にはnullを指定します)。

そこで、ポイントとなるクラスが3つ。

  • NetConnectionクラス
  • NetStreamクラス
  • Videoクラス

もちろんほかにも必要なクラスはありますが、この3つが柱になります。じゃあ、書いていきましょう。
今回はPlayerクラスというのを新たに作ります。パッケージの構成は同じくこのサイトの記事に書いてあるとおりです。

package com.tom_gs.www.Player {
    import flash.display.MovieClip;
    import flash.media.Video;
    import flash.net.NetConnection;
    import flash.net.NetStream;
    import flash.net.ObjectEncoding;
    import flash.events.NetStatusEvent;

     public class Player {
        private var nc:NetConnection;
        private var ns:NetStream;
        private var streamer:String;
        private var video:Video;
        private var target:MovieClip;
        private var playerEvent:PlayerEvent;
        private vat file;
       
        public function Player(streamer:String, target:MovieClip, file:String) {
            this.streamer = streamer;
            this.target = target;
            this.file = file;
            this.nc = new NetConnection();
            this.nc.addEventListener(NetStatusEvent.NET_STATUS, this.onNetStatusListener);
            this.nc.objectEncoding = ObjectEncoding.AMF0;
            this.nc.connect(this.streamer);
        }

        private function onNetStatusListener(evt:NetStatusEvent):void{
            var code:String = evt.info.code;
            if(code == "NetConnection.Connect.Success"){
                this.createPlayer();
            } else if( code == 'NetConnection.Connect.Closed'){
            } else {
            }
        }
       
        private function createPlayer():void {
            this.ns = new NetStream(this.nc);
            this.ns.client = this.target;
            this.video = new Video(480, 360);
            this.video.attachNetStream(this.ns);
            this.video.smoothing = true;
            this.target.addChild(this.video);
            this.ns.play(this.file);
        }
    }
}

実はこれだけ。
まずはコンストラクタで、ストリーミングサーバーのURLとムービーを表示するムービークリップ、再生するファイル名を受け取り、インスタンス変数に格納します。
次にポイントとなるクラスの1つ目、NetConnectionクラスを生成します。NetConnectionクラスは名前どおり、接続のタイミングを管理しているクラスです。接続処理の終了をイベントリスナーで取得して、connect()メソッドの引数にストリーミングサーバーのアドレスを指定して、接続を試みます。

このとき、接続が正常に確立しなくても、接続処理が終了するとイベントが発生します。
それがonNetStatusListener()メソッドの内容になります。NetStatusEventは接続処理を終了すると、失敗したかどうかをパブリック変数に文字列で保持しているみたいなので、それを元に分岐処理を記述します。今回は成功のときのみの処理を記述します。

接続が成功した場合、createPlayer()メソッドを実行します。
ここではNetStreamオブジェクトを生成します。NetStreamオブジェクトはNetConnectionオブジェクトのインスタンスを利用して、メディアの再生処理を行います。なので、コンストラクタの第1引数はNetConnectionオブジェクトを渡します。

さらにVideoオブジェクトを生成して、attachNetStream()メソッドで、NetStreamオブジェクトを関連付けます。さらに、コンストラクタで受け取ったステージ上のムービークリップにVideoオブジェクトを追加します。

で呼び出す側ですが、メインのクラスに以下のように記述します。

package com.tom_gs.www {
    import com.tom_gs.www.Player.Player;
    import flash.display.Sprite;

    public class Main extends Sprite {
        private var streamer:String = "rtmpe://[hostname-or-ipaddress]:[portno]/[application-name]";
        private var player:Player;

        public function Main() {
            this.player = new Player(this.streamer, this.screen, “test.flv”);
        }
    }
}

ちなみにWowzaのデフォルトインストールの場合、ポート番号は1935になります。また1.x系の場合、application-nameは「simplevideostreaming」、2.x系は「vod」となっています。

ステージ上に480x360ピクセルのムービークリップを作成して、インスタンス名に「screen」とつけます。