FlashMediaServer を使った録画と録音

FlashMediaServerを使った録画と録音をAS3で実装してみました。

New Project

Alternative content

Get Adobe Flash player



ここら辺の情報はあんまり多くない上にAS2の情報ばっかりだったりするので結構ハマりました。というか未だ解決しない問題もあるんだけど、諸事情により調査続行する必要がなくなったので晒しちゃいます。

ちなみにflaファイルです。
download

http://fms.denniehoopingarner.com/にある、AS2ソースをAS3に書き直しただけなんですが、webカムからキャプチャした画像を録画・再生できます。また、マイクからの音声だけを録音・再生もやってみました。

New Project

Alternative content

Get Adobe Flash player


基本的にトライアンドエラーでとりあえず「動いたよ」ってレベルの話なのでもっとエレガントな方法がどこかにあるはず。たぶん。


面白い事に、fmsでもred5でもswf側のコードはそのまま動きます。すごなあ〜、Red5。


stop();


var myServer:String =  "rtmp://hoge.fms.heteml.jp/var";
//myServer = "rtmp://nottinghill.llc.msu.edu/recordYourself/video"
var myRecording:String = "test001";
var myClip:String = myRecording

var myNS:NetStream
var myCam:Camera
var myMic:Microphone
var myVid:Video = _video

var myNC:NetConnection = new NetConnection();


tooltip_mc.visible = false;
   
function setStatus(msg){
    log(msg)
    status_txt.text = msg;
}


recBtn.addEventListener(MouseEvent.CLICK,recClip)
playBtn.addEventListener(MouseEvent.CLICK,playClip)
stopBtn.addEventListener(MouseEvent.CLICK,stopClip)


myNC.objectEncoding = ObjectEncoding.AMF0
myNC.addEventListener(NetStatusEvent.NET_STATUS,
    function(e:NetStatusEvent):void{
        setStatus("Connecting to server...");
        if(e.info.code == "NetConnection.Connect.Success")
        initStream();
        log(e.info.code)
    }
)

initCamera()
myNC.connect(myServer);

function initStream()
{
    setStatus("initStream");
   
    myNS = new NetStream(myNC);
    /**/
    myNS.bufferTime = 2;

    myNS.addEventListener(AsyncErrorEvent.ASYNC_ERROR,log)                     
                         
    myNS.addEventListener(NetStatusEvent.NET_STATUS,
        function(e:NetStatusEvent):void{
            trace("nsm :",e.info.code);
            switch(e.info.code)
            {
                 case "NetStream.Play.Complete":
                 setStatus("stopped.");
                 myVid.attachCamera(myCam);
                 break;
                 default:
                 break;
            }
        }
    )
    /**/
   
   
}

function initCamera():void
{   
    setStatus("initCamera");
    // init camera
    myCam = Camera.getCamera()
   
    myCam.setMode(240, 180, 15);
    myCam.setQuality(0, 90);
    myCam.setKeyFrameInterval(5);
    //myCam.setLoopback(true);
    myMic = Microphone.getMicrophone()
    myMic.setSilenceLevel(0)
    //myMic.setRate(22);
    myVid.attachCamera(myCam);
   
}

function recClip(e:MouseEvent = null)
{
    myVid.attachCamera(myCam)
   
    myNS.attachAudio(myMic);
   
    myNS.attachCamera(myCam);
    myNS.publish(myClip, "record");
    setStatus("recording.");
}

function playClip(e:MouseEvent = null)
{
    myNS.play(myClip);
    myVid.attachNetStream(myNS);
    setStatus("playing.");
}

function stopClip(e:MouseEvent = null)
{
    //myNS.publish(myClip,"stop")
    myNS.close()
    setStatus("stopped.");
    myVid.attachCamera(myCam);
}




  import flash.external.ExternalInterface;
  import flash.utils.getQualifiedClassName;

  function log(... args):void {
    var inspect:Function = function(arg:*, bracket:Boolean = true):String {
       
       
        var className:String = getQualifiedClassName(arg);
        var str:String;

        switch(getQualifiedClassName(arg)) {
            case 'Array':
              var results:Array = [];
              for (var i:uint = 0; i < arg.length; i++) {
                  results.push(inspect(arg[i]));
              }
              if (bracket) {
                str = '[' + results.join(', ') + ']';
              } else {
                str = results.join(', ');
              }
              break;
            case 'int':
            case 'uint':
            case 'Number':
              str = arg.toString();
              break;
            case 'String':
              str = arg;
              break;
            default:
              str = '[' + className + ':' + String(arg) + ']';
        }
        return str;
    }

    var r:String = inspect(args, false);
    trace(r)
   
    try
    {
        ExternalInterface.call('console.log', r);
    } catch (error:Error)
    {
    }
   
  }

Trackback

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

Leave your comment :

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




RSS + Contuct

  • rss
  • email

Credit

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