·您当前的位置:首页 > 技术教程 > AS2与AS3技术 >

[RTMP]Flash P2P应用AS3源代码示例

时间:2013-02-04 09:38hi.baidu.com
在A、B两台具有静态IP的机器上打开本页后,程序首先生成一个随机的用户名myName并自动连接到Adobe官方的stratus服务器,连接成功后,程序会自动获取一个myID号

经过两天两夜的艰苦努力,史上第一个Flash P2P源代码终于被我老虫搞出来啦!

再来看使用方法:

在A、B两台具有静态IP的机器上打开本页后,程序首先生成一个随机的用户名myName并自动连接到Adobe官方的stratus服务器,连接成功后,程序会自动获取一个myID号。将A中的myName和myID复制粘贴到B中的oppName和oppID中,单击B中的Call按钮呼叫A,当A中有呼叫的提示信息时,在A中单击Accept按钮,这样P2P连接就建立了!P2P连接建立后,可以播放对方视频,可以进行文本聊天。

通过该示例你可以:

1、了解如何使用新的RTMFP协议连接到远程服务器。

2、了解如何建立P2P连接。

3、了解如何发布和接收P2P流。

4、了解如何进行文本聊天。

已知问题:

1、(后经测试,是可以在广域网使用的!)。

2、在进行P2P呼叫的时候速度慢,即使是在同一个局域网内。

SWF文件在下面,你可以将它另存到桌面上使用,要注意允许SWF访问网络及相关的安全设置:

源代码如下:

  1. package { 
  2. import flash.display.MovieClip; 
  3. import fl.managers.StyleManager; 
  4. import flash.text.TextFormat; 
  5. import flash.net.NetConnection; 
  6. import flash.net.NetStream; 
  7. import flash.net.ObjectEncoding; 
  8. import flash.net.URLLoader; 
  9. import flash.net.URLRequest; 
  10. import flash.net.URLRequestMethod; 
  11. import flash.net.URLRequestHeader; 
  12. import flash.net.URLVariables; 
  13. import flash.events.Event; 
  14. import flash.events.IOErrorEvent; 
  15. import flash.events.MouseEvent; 
  16. import flash.events.AsyncErrorEvent; 
  17. import flash.events.SecurityErrorEvent; 
  18. import flash.events.NetStatusEvent; 
  19. import flash.media.SoundTransform; 
  20. import flash.media.Camera; 
  21. import flash.media.Microphone; 
  22. public class p2p extends MovieClip { 
  23.    private var fmsPath:String; 
  24.    private var myNC:NetConnection; 
  25.    private var controlStream:NetStream; 
  26.    private var outgoingStream:NetStream; 
  27.    private var incomingStream:NetStream; 
  28.    private var listenerStream:NetStream; 
  29.    private var yourName:String; 
  30.    private var yourID:String; 
  31.    private var oppName:String; 
  32.    private var oppID:String; 
  33.    private var WebServiceUrl:String; 
  34.    //正式开始喽 
  35.    public function p2p() { 
  36.     setCommonStyle(); 
  37.     init(); 
  38.    } 
  39.    private function setCommonStyle() { 
  40.     //CuPlayer.com提示:设置所有组件的样式 
  41.     var myTF:TextFormat=new TextFormat ; 
  42.     myTF.size=12
  43.     StyleManager.setStyle("textFormat",myTF); 
  44.    } 
  45.    //CuPlayer.com提示:初始化工作 
  46.    private function init() { 
  47.     fmsPath="rtmfp://stratus.adobe.com/HawkPrerelease-4e4efa13755c/FMSer.cn"
  48.     WebServiceUrl="http://76.74.170.61/cgi-bin/reg"
  49.     myNC=new NetConnection(); 
  50.     myNC.client=this
  51.     myNC.objectEncoding=ObjectEncoding.AMF3; 
  52.     myNC.addEventListener(NetStatusEvent.NET_STATUS,netStatus); 
  53.     myNC.addEventListener(SecurityErrorEvent.SECURITY_ERROR,securityError); 
  54.     myNC.addEventListener(AsyncErrorEvent.ASYNC_ERROR,asyncError); 
  55.     //CuPlayer.com提示:开始连接服务器 
  56.     myNC.connect(fmsPath); 
  57.     //CuPlayer.com提示:随机生成用户名 
  58.     myNameTxt.text="FMSer"+int(Math.random()*100); 
  59.     sendBtn.addEventListener(MouseEvent.CLICK,sendChatMsg); 
  60.    } 
  61.  
  62.    private function asyncError(e:AsyncErrorEvent) { 
  63.    } 
  64.    private function securityError(e:SecurityErrorEvent) { 
  65.    } 
  66.    //连接功能后将自己的用户名和ID传给WEB服务器暂存 
  67.    private function netStatus(e:NetStatusEvent) { 
  68.     switch (e.info.code) { 
  69.      case "NetConnection.Connect.Success" : 
  70.       trace("CuPlayer.com提示:连接成功!"); 
  71.       myIDTxt.text=myNC.nearID; 
  72.       callWebService(); 
  73.       break; 
  74.      case "NetConnection.Connect.Failed" : 
  75.       trace("CuPlayer.com提示:连接失败!"); 
  76.       break; 
  77.      case "NetConnection.Connect.Rejected" : 
  78.       trace("CuPlayer.com提示:连接失败!"); 
  79.       break; 
  80.      case "NetConnection.Connect.Closed" : 
  81.       trace("CuPlayer.com提示:连接中断!"); 
  82.       break; 
  83.     } 
  84.  
  85.    } 
  86.    //CuPlayer.com提示:完成用户信息提交工作 
  87.    private function callWebService() { 
  88.     var urlLoader:URLLoader = new URLLoader(); 
  89.     urlLoader.addEventListener(Event.COMPLETE, completeHandler); 
  90.     urlLoader.addEventListener(IOErrorEvent.IO_ERROR, ioerrorHandler); 
  91.     var urlRequest:URLRequest=new URLRequest(WebServiceUrl); 
  92.     var parameter:URLVariables=new URLVariables ; 
  93.     parameter.username=myNameTxt.text; 
  94.     parameter.identity=myIDTxt.text; 
  95.     urlRequest.data=parameter
  96.     urlLoader.load(urlRequest); 
  97.    } 
  98.    //准备呼叫和被呼叫 
  99.    private function completeHandler(e:Event) { 
  100.     callBtn.addEventListener(MouseEvent.CLICK,startCall); 
  101.     completeRegistration(); 
  102.    } 
  103.    private function ioerrorHandler(e:IOErrorEvent) { 
  104.    } 
  105.    //CuPlayer.com提示:开始呼叫 
  106.    private function startCall(e:MouseEvent) { 
  107.     oppName=oppNameTxt.text; 
  108.     oppID=oppIDTxt.text; 
  109.     placeCall(oppName,oppID); 
  110.    } 
  111.    //CuPlayer.com提示:呼叫主函数 
  112.    private function placeCall(tmpOppName:String,tmpOppID:String) { 
  113.     msgTxt.text="正在呼叫:"+tmpOppName+"..."; 
  114.     //尝试播放对方视频 
  115.     controlStream=new NetStream(myNC,tmpOppID); 
  116.     controlStream.addEventListener(NetStatusEvent.NET_STATUS,controlHandler); 
  117.     controlStream.play("control" +tmpOppName); 
  118.     //CuPlayer.com提示:对外发布点对点视频 
  119.     outgoingStream=new NetStream(myNC,NetStream.DIRECT_CONNECTIONS); 
  120.     outgoingStream.addEventListener(NetStatusEvent.NET_STATUS,outgoingStreamHandler); 
  121.     outgoingStream.publish("media-caller"); 
  122.     var o:* = new Object(); 
  123.     o.onPeerConnect =function (tmpNS:NetStream){ 
  124.     msgTxt.text="正在建立P2P连接..." 
  125.     }; 
  126.     ooutgoingStream.client=o; 
  127.     startAudio(); 
  128.     startVideo(); 
  129.     //接收来自外部的点对点视频 
  130.     incomingStream=new NetStream(myNC,tmpOppID); 
  131.     incomingStream.addEventListener(NetStatusEvent.NET_STATUS,incomingStreamHandler); 
  132.     incomingStream.play("media-callee"); 
  133.     var st:* =new SoundTransform(50); 
  134.     incomingStream.soundTransform=st
  135.     //CuPlayer.com提示:被呼叫方接受连接时触发该事件 
  136.     var i:* = new Object(); 
  137.     i.onCallAccepted =function (tmpOppName:String){     
  138.     msgTxt.text=tmpOppName+"已经接受了你的呼叫..." 
  139.     }; 
  140.     //被呼叫方接受连接时触发该事件 
  141.     i.onIm = function (userName:String,chatMsg:String){ 
  142.     chatContentchatContent.text =chatContent.text + (userName+ ": " + chatMsg + "\n"); 
  143.     chatContentchatContent.verticalScrollPosition =chatContent.textHeight; 
  144.     } 
  145.     
  146.     iincomingStream.client=i; 
  147.     remoteVideoDisplay.attachNetStream(incomingStream); 
  148.    } 
  149.    private function controlHandler(e:NetStatusEvent) { 
  150.     trace(e.info.code); 
  151.    } 
  152.    private function outgoingStreamHandler(e:NetStatusEvent) { 
  153.     outgoingStream.send("onIncomingCall",myNameTxt.text); 
  154.     trace(e.info.code);    
  155.    } 
  156.    private function startAudio() { 
  157.     var myMic:Microphone=Microphone.getMicrophone(0); 
  158.     outgoingStream.attachAudio(myMic); 
  159.    } 
  160.    private function startVideo() { 
  161.     var myCam:Camera=Camera.getCamera(); 
  162.     localVideoDisplay.attachCamera(myCam); 
  163.     outgoingStream.attachCamera(myCam); 
  164.    } 
  165.  
  166.    private function incomingStreamHandler(e:NetStatusEvent) { 
  167.     trace(e.info.code); 
  168.    } 
  169.    //向Web服务器提交完信息后为连接做准备 
  170.    private function completeRegistration() { 
  171.     listenerStream=new NetStream(myNC,NetStream.DIRECT_CONNECTIONS); 
  172.     listenerStream.addEventListener(NetStatusEvent.NET_STATUS,listenerHandler); 
  173.     listenerStream.publish("control" +myNameTxt.text);    
  174.     var c:* = new Object(); 
  175.     c.onPeerConnect = function (tmpNS:NetStream){ 
  176.     var caller:* =tmpNS; 
  177.     incomingStream = new NetStream(myNC,caller.farID); 
  178.     incomingStream.addEventListener(NetStatusEvent.NET_STATUS, incomingStreamHandler); 
  179.     incomingStream.play("media-caller"); 
  180.     var st:SoundTransformnew SoundTransform(50); 
  181.     incomingStream.soundTransform = st
  182.     incomingStream.receiveAudio(false); 
  183.     incomingStream.receiveVideo(false); 
  184.     var i:Objectnew Object(); 
  185.     i.onIncomingCall = function (tmpOppName:String){ 
  186.     msgTxt.text=tmpOppName+"正在呼叫你,你接受吗?" 
  187.     acceptBtn.addEventListener(MouseEvent.CLICK,acceptCall) 
  188.     } 
  189.     i.onIm = function (userName:String,chatMsg:String){ 
  190.     chatContentchatContent.text =chatContent.text + (userName+ ": " + chatMsg + "\n"); 
  191.     chatContentchatContent.verticalScrollPosition =chatContent.textHeight; 
  192.     } 
  193.     iincomingStream.client = i; 
  194.     }; 
  195.     listenerStream.client=c; 
  196.    } 
  197.    private function listenerHandler(e:NetStatusEvent) { 
  198.     trace(e.info.code); 
  199.    } 
  200.    
  201.    //CuPlayer.com提示:接受呼叫 
  202.    public function acceptCall(e:MouseEvent) { 
  203.     msgTxt.text="你已经接受了对方的呼叫..."
  204.     incomingStream.receiveAudio(true); 
  205.     incomingStream.receiveVideo(true); 
  206.     remoteVideoDisplay.attachNetStream(incomingStream); 
  207.     outgoingStream=new NetStream(myNC,NetStream.DIRECT_CONNECTIONS); 
  208.     outgoingStream.addEventListener(NetStatusEvent.NET_STATUS,outgoingStreamHandler); 
  209.     outgoingStream.publish("media-callee"); 
  210.     var o:* = new Object(); 
  211.     o.onPeerConnect = function (tmpNS:NetStream){ 
  212.        trace(tmpNS.farID);     
  213.     } 
  214.     ; 
  215.     ooutgoingStream.client=o; 
  216.     outgoingStream.send("onCallAccepted",myNameTxt.text); 
  217.     startVideo(); 
  218.     startAudio(); 
  219.    } 
  220.    //CuPlayer.com提示:发送聊天信息 
  221.    private function sendChatMsg(e:MouseEvent) { 
  222.     var tmpMsg:* =chatTxt.text;    
  223.     if (tmpMsg!=0&&outgoingStream) { 
  224.      chatContentchatContent.text=chatContent.text+myNameTxt.text+": "+tmpMsg+"\n"; 
  225.      outgoingStream.send("onIm",myNameTxt.text,tmpMsg); 
  226.      chatTxt.text=""
  227.     } else { 
  228.      chatContent.appendText("发送内容为空或连接尚未建立!"+"\n"); 
  229.      chatTxt.text=""
  230.     } 
  231.    } 

 

热门文章推荐

请稍候...

保利威视云平台-轻松实现点播直播视频应用

酷播云数据统计分析跨平台播放器