AIR for Android で Flash Media Server を使ってストリーミング配信・受信する方法

AIR for AndroidFlash Media Server を使ってストリーミング配信・受信する方法

AIR for Android でも Flash Media Server を使ってストリーミング配信・受信ができましたので簡単な説明をしたいと思います。
まずは Flash Media Server のダウンロードとインストールを行います。

Flash Media Server の代わりに Red5 でも大丈夫だと思いますが、自分の環境が Windows7 64 bit なため、Flash Media Server にて試してみました。
次に FlashBuilder Burrito を使用してよりFlex Mobile Project より AndroidAIRアプリを作ります。

今回は、せっかくなので配信・受信の両方をAndroid端末でやってみました。
送信アプリと受信アプリのソースは以下になります。

Android端末の配信側 views/fmsTestPublishAndroidHome.mxml

<?xml version="1.0" encoding="utf-8"?>
<s:View xmlns:fx="http://ns.adobe.com/mxml/2009"
        xmlns:s="library://ns.adobe.com/flex/spark" title="Home"
        creationComplete="init()" xmlns:mx="library://ns.adobe.com/flex/mx"
        >
    <fx:Script>
        <![CDATA[
            import mx.core.UIComponent;
            private var nc:NetConnection;
            private var ns:NetStream;
            private var nsPlayer:NetStream;
            private var vid:Video;
            private var vidPlayer:Video;
            private var cam:Camera;
            private var mic:Microphone;
            private function init():void{
                nc = new NetConnection();
                nc.client = this;
                nc.addEventListener(NetStatusEvent.NET_STATUS, onNetStatus);
                nc.connect("rtmp://localhost/live");
            }
            private function onNetStatus(event:NetStatusEvent):void {
                if(event.info.code == "NetConnection.Connect.Success"){
                    publishCamera();
                    displayPublishingVideo();
//                    displayPlaybackVideo();
                }
            }
            private function publishCamera():void{
                cam = Camera.getCamera();
                mic = Microphone.getMicrophone();
                ns = new NetStream(nc);
                ns.attachCamera(cam);
                ns.attachAudio(mic);
                ns.publish("myCameraAndroid", "live");
            }
            private function displayPublishingVideo():void {
                vid = new Video();
                vid.x = 10;
                vid.y = 10;
                vid.attachCamera(cam);
                container.addChild(vid);
            }
            /*
            private function displayPlaybackVideo():void{
                nsPlayer = new NetStream(nc);
                nsPlayer.play("myCameraAndroid");
                vidPlayer = new Video();
                vidPlayer.x = cam.width + 20;
                vidPlayer.y = 10;
                vidPlayer.attachNetStream(nsPlayer);
                container.addChild(vidPlayer);
            }
            */
            public function onBWDone():void {
                trace("onBWDone");
            }
            public function onMetaData(infoObj:Object):void {
                trace("onMetaData");
            }
            public function onPlayStatus(infoObj:Object):void {
                trace("playStatus");
            }
        ]]>
    </fx:Script>
    <fx:Declarations>
        <!-- Place non-visual elements (e.g., services, value objects) here -->
    </fx:Declarations>
    <mx:UIComponent id="container" width="100%" height="100%" />
</s:View>

Android端末の受信側 views/fmsTestViewerAndroidHome.mxml

<?xml version="1.0" encoding="utf-8"?>
<s:View xmlns:fx="http://ns.adobe.com/mxml/2009"
        xmlns:s="library://ns.adobe.com/flex/spark" title="Home"
         creationComplete="init()" xmlns:mx="library://ns.adobe.com/flex/mx"
        >
    <fx:Script>
        <![CDATA[
            import mx.core.UIComponent;
            private var nc:NetConnection;
            private var ns:NetStream;
            private var cam:Camera;
            private var mic:Microphone;
            private function init():void{
                nc = new NetConnection();
                nc.client = this;
                nc.connect("rtmp://192.168.20.21/live");
                nc.addEventListener(NetStatusEvent.NET_STATUS,onNetStatus);
                nc.addEventListener(SecurityErrorEvent.SECURITY_ERROR,onSecurityError);
            }
            private function onNetStatus(evt:NetStatusEvent):void {
                trace( "onNetstatus" );
                switch(evt.info.code) {
                    case "NetConnection.Connect.Success":
                        setupCameraMic();
                        trace("Success");
                        break;
                    case "NetConnection.Connect.Closed":
                        trace("Closed");
                        break;
                    case "NetConnection.Connect.Failed":
                        trace("Failed");
                        break;
                    case "NetConnection.Connect.Rejected":
                        trace("Rejected");
                        break;
                    default:
                }
            }
            private function onSecurityError(evt:SecurityErrorEvent):void {
                trace("Security Error");
            }
            private function setupCameraMic():void{
                ns = new NetStream( nc );
                ns.client = new CustomClient();
                var video:Video = new Video();
                video.attachNetStream(ns);
                ns.play("myCameraAndroid" , -1 );
                container.addChild(video);
            }
            public function onBWDone():void {
                trace("onBWDone");
            }
            public function onMetaData(infoObj:Object):void {
                trace("onMetaData");
            }
            public function onPlayStatus(infoObj:Object):void {
                trace("playStatus");
            }
        ]]>
    </fx:Script>
    <fx:Declarations>
        <!-- Place non-visual elements (e.g., services, value objects) here -->
    </fx:Declarations>
    <mx:UIComponent id="container" width="100%" height="100%"/>
</s:View>

現在ですと Android アプリに Ustream があるので、それほど目新しいことではありませんが、Flashならではの機能を追加してみたいですね。画像処理やネットワークやゲームなどなど。