P2P,视频、语音一对一聊天

package
{
import flash.display.Sprite;
import flash.display.StageScaleMode;
import flash.events.MouseEvent;
import flash.events.NetStatusEvent;

import flash.net.NetConnection;
import flash.net.ObjectEncoding;

import flash.media.Camera;
import flash.net.NetStream;
import flash.media.SoundTransform;
import flash.media.Microphone;

//[SWF(backgroundColor = 0xffffff,width = 1003,height = 527)]

public class Main extends Sprite
{
private var server:String = "rtmfp://p2p.rtmfp.net/";
private const DeveloperKey:String = "9bb73c685f27383f07976dbb-60df5c2574da/twomen";
private var chatPanel;

private var controlStream:NetStream;
private var outStream:NetStream;
private var inStream:NetStream;
private var listenerStream:NetStream;

private var yourName:String;
private var yourId:String;
private var oppName:String;
private var oppId:String;



private var nc;
private var cam;
private var mic;
public function Main():void
{
stage.scaleMode = StageScaleMode.NO_SCALE;
Init();
}
private function Init()
{
showMes("我要开始了!");
chatPanel=new ChatPanel();
chatPanel.x = stage.stageWidth / 2 - chatPanel.di.width / 2;
chatPanel.y = stage.stageHeight / 2 - chatPanel.di.height / 2;
addChild(chatPanel);
chatPanel.linkBtn.label = "Connect";
chatPanel.sendBtn.label = "Send";
chatPanel.acceptBtn.label = "Accept";
chatPanel.callBtn.label = "Call";
chatPanel.linkBtn.addEventListener(MouseEvent.CLICK,clickHandler);
startVideo();
}
private function clickHandler(e:MouseEvent)
{
yourName = chatPanel.myName.text;
nc=new NetConnection();
nc.client = this;
nc.objectEncoding = ObjectEncoding.AMF3;
nc.addEventListener(NetStatusEvent.NET_STATUS,statusEvent);
nc.connect(server+DeveloperKey);
chatPanel.sendBtn.addEventListener(MouseEvent.CLICK,sendChatMsg);
}

private function statusEvent(e:NetStatusEvent)
{
//trace(e.info.code);
var code = e.info.code;
switch (code)
{
case "NetConnection.Connect.Success" :
chatPanel.myId.text = nc.nearID;
yourId = nc.nearID;
chatPanel.callBtn.addEventListener(MouseEvent.CLICK,startCall);
planStream();//准备流
break;

default :
break;
}

}

private function listenerHandler(e:NetStatusEvent)
{
trace(e.info.code);
}
private function inHandler(e:NetStatusEvent)
{
trace(e.info.code);
}

private function outHandler(e:NetStatusEvent)
{
trace("onInCall"+e.info.code);
outStream.send("onInCall",chatPanel.myName.text);
}

private function controlHandler(e:NetStatusEvent)
{
trace(e.info.code);
}

private function startCall(e:MouseEvent)
{
trace("你要开始call了啊。。");
oppName = chatPanel.oppName.text;
oppId = chatPanel.oppId.text;
placeCall(oppName,oppId);
}
private function placeCall(tmpOppName:String,tmpOppId:String)
{
chatPanel.msg.text = "正在呼叫:" + tmpOppName + "...";
controlStream = new NetStream(nc,tmpOppId);
controlStream.addEventListener(NetStatusEvent.NET_STATUS,controlHandler);
controlStream.play("control"+tmpOppName);

outStream = new NetStream(nc,NetStream.DIRECT_CONNECTIONS);
outStream.addEventListener(NetStatusEvent.NET_STATUS,outHandler);
outStream.publish("media-caller");

var outObj=new Object();
outStream.client = outObj;
outObj.onPeerConnect=function(tmpNs:NetStream)
{
chatPanel.msg.text="正在建立P2P连接……";
};
startAudio();
startVideo();
//接受来自外部的丶对丶视频
inStream = new NetStream(nc,tmpOppId);
inStream.addEventListener(NetStatusEvent.NET_STATUS,inHandler);
inStream.play("media-callee");
var st = new SoundTransform(50);
inStream.soundTransform = st;
//被呼叫方接受连接时触发该事件
var inObj=new Object();
inStream.client = inObj;
inObj.onCallAccepted=function(tmpOppName:String)
{
showMes("已经接受了你的呼叫");
chatPanel.msg.text=tmpOppName+"已经接受了你的呼叫……";
}
;
inObj.onIm=function(userName:String,chatMsg:String)
{
chatPanel.chatContent.text+=userName+":"+chatMsg+"\n";
chatPanel.chatContent.verticalScrollPosition=chatPanel.chatContent.textHeight;
};
chatPanel.remoteVideoDisplay.attachNetStream(inStream);
}

private function acceptCall(e:MouseEvent)
{
chatPanel.msg.text = "你已经接受了对方的呼叫……";
inStream.receiveAudio(true);
inStream.receiveVideo(true);
chatPanel.remoteVideoDisplay.attachNetStream(inStream);

outStream = new NetStream(nc,NetStream.DIRECT_CONNECTIONS);
outStream.addEventListener(NetStatusEvent.NET_STATUS,outHandler);
outStream.publish("media-callee");
var outObj=new Object();
outStream.client = outObj;
outObj.onPeerConnect=function (tmpNs:NetStream)
{
  trace(tmpNs.farID);
};
showMes("请问,请问,到这来了么");
outStream.send("onCallAccepted",chatPanel.myName.text);
startVideo();
startAudio();
}

private function planStream()
{
listenerStream = new NetStream(nc,NetStream.DIRECT_CONNECTIONS);
listenerStream.addEventListener(NetStatusEvent.NET_STATUS,listenerHandler);
listenerStream.publish(("control"+yourName));
var listenerObj=new Object();
listenerStream.client = listenerObj;

listenerObj.onPeerConnect=function(tmpNs:NetStream)
{
  showMes("我这个是在哪里呀。。。");
  var caller=tmpNs;
  inStream=new NetStream(nc,caller.farID);
  inStream.addEventListener(NetStatusEvent.NET_STATUS,inHandler);
  inStream.play("media-caller");

  var st:SoundTransform=new SoundTransform(50);
  inStream.soundTransform=st;
  inStream.receiveAudio(false);
  inStream.receiveVideo(false);
  var inObj=new Object();
  inStream.client = inObj;
  showMes("为什么啊");
  inObj.onInCall=function(tmpOppName:String)
  {
   showMes("为什么啊,为什么啊啊");
   chatPanel.msg.text=tmpOppName+"正在呼叫你,你接受吗?";
   chatPanel.acceptBtn.addEventListener(MouseEvent.CLICK,acceptCall);
  }
  showMes("一个一个滴");
  inObj.onIm=function(userName:String,chatMsg:String)
  {
  chatPanel.chatContent.text=chatPanel.chatContent.text+(userName+":"+chatMsg+"\n");
  chatPanel.chatContent.verticalScrollPosition=chatPanel.chatContent.textHeight;
  }
};
}

private function startVideo()
{
cam = Camera.getCamera();
if (cam!=null)
{
cam.setMode(chatPanel.localVideoDisplay.width,chatPanel.localVideoDisplay.height,10);
cam.setQuality(0,80);
chatPanel.localVideoDisplay.attachCamera(cam);
if (outStream)
{
outStream.attachCamera(cam);
}
}
}

private function startAudio()
{
var myMic:Microphone = Microphone.getMicrophone();
if (myMic!=null)
{
if (outStream)
{
outStream.attachAudio(myMic);
}
}
}

//***************************发送聊天信息***************************
private function sendChatMsg(e:MouseEvent)
{
showMes("发送发送");
var tmpMsg = chatPanel.chat.text;
if (tmpMsg.length <= 1)
{
chatPanel.chatContent.appendText("你发送内容为空"+"\n");
chatPanel.chat.text = "";
return;
}
if (outStream)
{
chatPanel.chatContent.text = chatPanel.chatContent.text + chatPanel.myName.text + ":" + tmpMsg + "\n";
outStream.send("onIm",chatPanel.myName.text,tmpMsg);
chatPanel.chat.text = "";
}
else
{
chatPanel.chatContent.appendText("你连接尚未建立"+"\n");
chatPanel.chat.text = "";
}
}
private function showMes(str:String)
{
txt.appendText(str+"\n");
}

}
}

你可能感兴趣的:(stagescalemode,netstatusevent)