RTMFP Voice Chat test
Now building....
/*
FlashPlayer10.1から追加された、RTMFPのピアアシストネットワークを使用して、
P2Pクラスタを構成してボイスチャット
Stratus(Cirrus)への接続は私のものを使用していますので、forkされる場合は各自変更お願いします。
左上のボックスにチャンネル名を入力してEnterキーを押すと接続します。
同一のチャンネル名に接続した同士がボイスチャット出来ます。
各チャンネルは独立しています。
自分の声がループバックして聞こえるのは気のせいということにしてください。
NetGroupの理解不足で、正常に動作してません。
*/
package {
import flash.display.Sprite;
import flash.display.Shape;
import flash.events.NetStatusEvent;
import flash.net.*;
import flash.events.Event;
import flash.events.MouseEvent;
import flash.text.TextFieldAutoSize;
import flash.events.KeyboardEvent;
import flash.ui.Keyboard;
import flash.external.ExternalInterface;
import flash.text.TextField;
import flash.text.TextFieldType;
import flash.media.Microphone;
public class RTMFPVoiceChat extends Sprite {
private var debugout:TextField;
private var chTxt:TextField;
private var ar:Array;
private var logar:Array;
private var gs:GroupSpecifier;
private var nc:NetConnection;
private var nsr:NetStream;
private var nss:NetStream;
private var group:NetGroup;
public function RTMFPVoiceChat() {
// init debugout
debugout = new TextField();
debugout.x = 50;
debugout.y = 50;
debugout.autoSize = TextFieldAutoSize.LEFT;
debugout.background = true;
debugout.border = true;
debugout.backgroundColor = 0x000000;
debugout.textColor = 0x0000FF;
addChild(debugout);
chTxt = new TextField();
chTxt.border = true;
chTxt.multiline = false;
chTxt.width = 100;
chTxt.height = 20;
chTxt.restrict = "A-Za-z0-9";
chTxt.type = TextFieldType.INPUT;
chTxt.addEventListener(KeyboardEvent.KEY_DOWN, onKeyDown);
addChild(chTxt);
}
private function onKeyDown(e:KeyboardEvent):void {
if (e.keyCode == Keyboard.ENTER) {
chTxt.border = false;
chTxt.type = TextFieldType.DYNAMIC;
chTxt.removeEventListener(KeyboardEvent.KEY_DOWN, onKeyDown);
// init rtmfp group spec
gs = new GroupSpecifier("net.wonderfl.fake.voicechat." + chTxt.text);
gs.postingEnabled = true;
gs.ipMulticastMemberUpdatesEnabled = true;
gs.multicastEnabled = true;
gs.objectReplicationEnabled = true;
gs.routingEnabled = true;
gs.serverChannelEnabled = true;
// init rtmfp connection
nc = new NetConnection();
nc.addEventListener(NetStatusEvent.NET_STATUS, procNetStatus);
nc.connect("rtmfp://p2p.rtmfp.net/445d9931dfac67103408ae5f-ad98e28e2386/");
}
}
private function initStream():void {
nsr = new NetStream(nc, gs.toString());
nsr.play(chTxt.text);
nss = new NetStream(nc, gs.toString());
nss.attachAudio(Microphone.getMicrophone());
nss.publish(chTxt.text);
}
private function procNetStatus(e:NetStatusEvent):void {
debugout.appendText(e.info.code + "\n");
switch (e.info.code) {
case "NetConnection.Connect.Success":
group = new NetGroup(nc, gs.groupspecWithAuthorizations());
group.addEventListener(NetStatusEvent.NET_STATUS, procNetStatus);
break;
case "NetGroup.Connect.Success":
initStream();
break;
case "NetGroup.Neighbor.Connect":
break;
case "NetGroup.Posting.Notify":
break;
case "NetGroup.Replication.Request":
break;
case "NetGroup.Replication.Fetch.Result":
break;
}
}
}
}