maaash.jp

what I create

Adobe Stratusサンプルを読み解く

Stratus Sample Application
がコードといっしょに公開されているので読んでみる。

■NetConnectionでAdobeの提供しているrtmfpサーバstratusにつなぐ
予めDeveloperKeyを手に入れておく。

[as]netConnection = new NetConnection();
netConnection.addEventListener(NetStatusEvent.NET_STATUS, netConnectionHandler);
netConnection.connect(“rtmfp://stratus.adobe.com/” + DeveloperKey);
[/as]

NetStatusEventの NetConnection.Connect.Sucess になると、
NetConnection.nearID がとれる
この64桁のIDが、他のPeerから自分につなぐために、
相手が知る必要のある情報

webサービスに登録しておいて、
ユーザー名と照合できるようにしておく
#これがHttpIdManager.asのお仕事

なんだろサンプルでは4つのNetStream使ってるけど、
お互いの2つだけでいけそうだなぁ。

■音声/映像のやり取り
ユーザー名知ってる人に電話かけようかなと思ったら、
webサービスに照合して、相手の64桁のIDをもらい、
それをNetStreamに渡す(identity)

[as]incomingStream = new NetStream(netConnection, identity);
incomingStream.play(“media-callee”);
[/as]

playすれば音が鳴るし、VideoにattachNetStreamすれば相手の映像が見える
出す方は、DIRECT_CONNECTIONS設定してpublishする

[as]
outgoingStream = new NetStream(netConnection, NetStream.DIRECT_CONNECTIONS);
outgoingStream.publish(“media-caller”);[/as]

publish,playに渡す引数は、電話かける方はmedia-caller,受ける方はmedia-calleeとしてるけどなんでもよさそう。
ルールを決めておけばよい。

↓clientにonPeerConnectって関数を入れておくと、
誰かPeerがつないできたときに、farIDが取れる。
onPeerConnectがtrueを返せば接続ok、
falseを返せば接続ngッぽいので、
非接続側でもう一度webサービスにfarIDを照合して誰が電話かけてきたのか着信履歴表示や着信拒否ができそうだね

[as]
var o:Object = new Object
o.onPeerConnect = function(caller:NetStream):Boolean {
status(“Callee connecting to media stream: ” + caller.farID + “\n”);
return true;
}
outgoingStream.client = o;
[/as]

■RPC
NetStream.sendを使えばPeer2PeerのRPCも簡単。

[as]
outgoingStream.send(“onIm”, userNameInput.text, msg);[/as]

受け側のNetStream.clientにぶらさがってる関数が呼び出される

[as]i.onIm = function(name:String, text:String):void {
textOutput.text += name + “: ” + text + “\n”;
}[/as]

■帯域
NetStream.info.audioBytesPerSecond, NetSteam.info.videoBytesPerSecond,
とか使うとどれくらい帯域使ってるのか見えるようだ。
おー droppedFrames ってプロパティとかもある。

■結論
AIR1.5でもいけるようだし、こりゃ機能的にはSkypeレベルのものが簡単につくれそうだ。
あとは映像や音声の品質がどれくらい出るか。

Adobeの中の人のarticleもおもしろい

Stratus service for developing end-to-end applications using RTMFP in Flash Player
・Nat越えはUDPで。
・ファイアウォールやSymmetric Natだった場合用に、TURN proxy (Traversal Using Relays around NAT)を使うようにFlash Playerを設定することも可能だとか。でもローカルのmms.cfgファイルにTURNプロキシのIPを入れたり、ってそんなめんどくさいことできないわ。Nat越えできない人たちはとりあえず切り捨てそうだね。

Comments