FlashMediaServer を使った録画と録音
ここら辺の情報はあんまり多くない上にAS2の情報ばっかりだったりするので結構ハマりました。というか未だ解決しない問題もあるんだけど、諸事情により調査続行する必要がなくなったので晒しちゃいます。
ちなみにflaファイルです。
download
http://fms.denniehoopingarner.com/にある、AS2ソースをAS3に書き直しただけなんですが、webカムからキャプチャした画像を録画・再生できます。また、マイクからの音声だけを録音・再生もやってみました。
基本的にトライアンドエラーでとりあえず「動いたよ」ってレベルの話なのでもっとエレガントな方法がどこかにあるはず。たぶん。
面白い事に、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)
{
}
}