éçºè ã¯ããã±ããã®éä¿¡æã«ãããã³ã«ã®é å»¶æéãçãããããšãçŽæããŸãããæãéèŠãªããšã¯ããããã³ã«ããã¢ããŒãã¢ãããã¯ãŒã¯ã®ç·šæã«çŠç¹ãåãããŠããããšã§ã ã
Flash Playerã®ä»¥åã®ããŒãžã§ã³ã§ã¯ãRTMPãä»ãããªã¢ã«ã¿ã€ã ã®ããŒã¿è»¢éã䜿çšãããå€å€§ãªééçè²»çšãå¿ èŠã§ããã Adobe Flash Media ServerïŒFMSïŒã®æ©èœã«ã¯ãéåžžã«é«äŸ¡ã§æ°ãŸãããªãã¹ãã£ã³ã°ãå¿ èŠã§ãïŒãã®ããžãã¹å šäœã«ã¯å€ãã®ãªãœãŒã¹ãããããµãŒããŒã·ã¹ãã ã«åå¥ã®ãœãããŠã§ã¢ã¢ãŒããšããŠã€ã³ã¹ããŒã«ããããããç©çãµãŒããŒãã¬ã³ã¿ã«ãããŸã§ïŒã
RTMPã¯ãã¡ãã£ã¢ã®ã¹ããªãŒãã³ã°ãããŸããŸãªããŒã¿ã®å ±æããŸãã¯ãªã¢ãŒã/åæäœ¿çšã«æé©ã§ãã
ãã®ãããæ°ãããããã³ã«ïŒRTMFPïŒã«ã¯æ¢ã«ããã¢ããŒãã¢ããšããããã¯ããŒã ãä»ããããŠããŸãã AIRããã³Flexã¢ããªã±ãŒã·ã§ã³ãå®è¡ããããã®ãµãŒãããŒãã£ã®ã¡ãã£ã¢ãµãŒããŒã®å³å¯ãªå¿ èŠæ§ã¯ãããŸããã ãµãŒããŒã¯ååšãããããã«ãã¡ãã£ã¢ããã®ä»ã®ããŒã¿ãåŠç/ä¿åãããµãŒããŒã§ã¯ãªããã¯ã©ã€ã¢ã³ãïŒãã¢ïŒéã®ã»ãã·ã§ã³ã®ã¿ãå¶åŸ¡ãããã©ãã£ãã¯ã忣ãããããã峿 Œããªã®ã¯ãªãã§ããã
Jozsef VassïŒ Joseph WassãAdobe / Flash Runtime Foundationã®äž»ä»»ç ç©¶å¡ã以åã¯é©æ°çãªVoIPãã¯ãããžãŒã®äŒç€Ÿã§åããŠããïŒã®ã¡ãã»ãŒãžã¯ã ãFlash Player 10ã§RTMFPã䜿çšããŠãšã³ãããŒãšã³ãã¢ããªã±ãŒã·ã§ã³ãéçºããããã®CirrusãµãŒãã¹ã ããFlash Player 10ã§RTMFPã䜿çšããŠãšã³ãã¢ããªã±ãŒã·ã§ã³ãéçºããããã®CirrusãµãŒãã¹ã ïŒRTMFPã䜿çšããã«ã¯ãFlash Playerãã¢ã¯Cirrus ïŒä»¥åã®ã³ãŒãããŒã Stratus ïŒãFlash Media Serverãªã©ã®RTMFPäºæãµãŒããŒã«æ¥ç¶ããå¿ èŠããããŸã4.èšäºã§ã¯ãCirrusã¯ã€ã³ã¹ããŒã«ã«åœ¹ç«ã€ãããã¯ãŒã¯ãµãŒãã¹ã§ãããšè¿°ã¹ãŠããŸãã 圌ãã®ãã©ãã·ã¥ãã¬ãŒã€ãŒãéããŠã¯ã©ã€ã¢ã³ãïŒãã¢ïŒã®éã®IDEã èšäºã®è³æãšã¢ããªã±ãŒã·ã§ã³ã«åºã¥ããŠãåæ§ã®ãµãŒããŒãWebãªãœãŒã¹äžã§ç·šæã§ããŸãïŒ ã¢ããªã±ãŒã·ã§ã³ã®ãœãŒã¹ããã¡ã€ã«ãreg.cgiããåç §ïŒã
RTMFPã®å©ç¹ã«ã€ããŠ
-ãããã³ã«ã¯ã倱ãããããŒã¿ãã±ãããåéä¿¡ããç¿æ £ãããããã äŒéå¶åŸ¡ãããã³ã«ïŒTCPïŒã«ãã£ãŠå¶åŸ¡ãããŸããããã¯ã©ã€ã¢ã³ãïŒãã¢ïŒãšãµãŒããŒéã®å¿çæéãççž®ãããŠãŒã¶ãŒããŒã¿ã°ã©ã ãããã³ã«ïŒUDPïŒã«åºã¥ããŠããŸãã ããã«ãã»ãšãã©ã®å ŽåãUDPã¯ãã¡ã€ã¢ãŠã©ãŒã«ã«ãã£ãŠãããã¯ãããªãããããã¡ã€ã¢ãŠã©ãŒã«ãåæ§æããå¿ èŠããããŸããã
-ããŒã¿ã¯ãäžå€®ãµãŒããŒãçµç±ããã«ãªã¢ã«ã¿ã€ã ã§2ã€ã®Flash Playerã¯ã©ã€ã¢ã³ãéã§çŽæ¥éä¿¡ãããŸãã
-2ã€ã®ã¯ã©ã€ã¢ã³ãïŒãã¢ïŒéã®ã€ã³ã¿ãŒããããã£ãã«ã®å¹ ã«èŠåãã ãã®é«å質ã®ãã«ãã¡ãã£ã¢ã®éä¿¡ããµããŒãããŸãã
-ãã®ååšãããªãã¡ Cirrus adobeãããŒå¶åŸ¡ãµãŒãã¹ïŒrtmfpïŒ//p2p.rtmfp.netãéçºè ããŒã䜿çšããŠãããã³ã«ã䜿çšããå¯èœæ§ã確èªããŸãã ç¹°ãè¿ããŸãããFlash Media Serverãšã¯äœã®é¢ä¿ããããŸããã Cirrusã¯ãFlash Playerã€ã³ã¹ã¿ã³ã¹ããªã³ã©ã€ã³ã§ãäºããèŠã€ããããã«ã®ã¿äœ¿çšãããŸãã
-Diffie-Hellmannéµäº€ææ¹åŒã䜿çšãã128ãããAESã«ãããå®å šãªæ¥ç¶ãå®çŸãããŸãã SSLãŸãã¯RTMPSã®ãµããŒãã
-ActionScript 3.0ã®åå¥ã®ã¯ã©ã¹ã®ååšã
ãã¢ããŒãã¢æŸéã®çµç¹
Adobe Cirrusã䜿çšããåã«ãAdobe Labsããéçºè ããŒãååŸããå¿ èŠããããŸãã ãã¢ã¯ãCirrusã䜿çšããã«çžäºã«éä¿¡ã§ããŸãã ããã«ã¯ãã¯ã©ã€ã¢ã³ããåãããŒã«ã«ãããã¯ãŒã¯äžã«ããããšãå¿ èŠã§ãããããã¯éåžžã«ãŸãã§ãã
Adobe CirrusãµãŒãã¹ã«æ¥ç¶ããã«ã¯ã NetConnectionã®ã€ã³ã¹ã¿ã³ã¹ãäœæããå¿ èŠããããŸãã æ¥ç¶æã«ã¯ã以äžã«ç€ºãããã«ãAdobe Cirrus URLãšéçºè ããŒã®2ã€ã®æååãã©ã¡ãŒã¿ãŒãæž¡ãå¿ èŠããããŸãã
private const CirrusAddress:String = "rtmfp://p2p.rtmfp.net";
private const DeveloperKey:String = "your-developer-key";
private var netConnection:NetConnection;
netConnection = new NetConnection();
// (listener)
netConnection.addEventListener(NetStatusEvent.NET_STATUS, netConnectionHandler);
// Cirrus
netConnection.connect(CirrusAddress, DeveloperKey);
Cirrusãšã®æ¥ç¶ãæåããå ŽåãæååãNetConnection.Connect.SuccessããNetStatusEvent.NET_STATUSã®info.codeããããã£ã«å²ãåœãŠãããŸãã
泚ïŒçŸåšãCirrusã䜿çšããå Žåã NetConnection.callïŒïŒã¡ãœããã¯ãµããŒããããŠããŸããã NetConnection.callïŒïŒã®åŒã³åºãã¯ãCirrusã«ãã£ãŠç¡èŠãããŸãã éçºè ã¯ãCirrusã§RTMFPã䜿çšããå Žåã NetConnection.callïŒïŒã¡ãœããã䜿çšããªãããšããå§ãããŸããããã«ãããå¿ èŠãªæ©èœå¹æãªãã§ã¯ã©ã€ã¢ã³ãã®ã¡ã¢ãªæ¶è²»ãå¢å ããŸãã
Flash Playerã€ã³ã¹ã¿ã³ã¹ãCirrusãµãŒãã¹ã«æ£åžžã«æ¥ç¶ããããšãä»ã®Flash Playerã¯ã©ã€ã¢ã³ããã¢ã¯ã»ã¹ã§ããããã«ãCirrusãµãŒãã¹ãã¯ã©ã€ã¢ã³ãã®IPã¢ãã¬ã¹ãšããŒãçªå·ã«ãã€ã³ãããããã«äœ¿çšããäžæã®256ãããã®peer_IDãåãåããŸãã
æ°ããCirrus 2ãµãŒããŒãã£ãã«ãšFlash Player 10.1ã䜿çšããŠãæåã§peer_IDã亀æããããšãªããèªå·±ç®¡çã®P2Pãããã¯ãŒã¯ã圢æã§ããããã«ãªããŸããã ããã«ãããè€æ°ã®Flash Playerã¯ã©ã€ã¢ã³ããæãå¹ççãªæ¹æ³ã§äºãã«çŽæ¥éä¿¡ã§ããŸãã
次ã«ãã¯ã©ã€ã¢ã³ãïŒãã¢ïŒãšã®æ¥ç¶ã確ç«ãããŸãã çŽæ¥ã¹ããªãŒãã³ã°ã¯ãåæ¹åã®NetStreamãã£ãã«ã䜿çšããŠå®çŸãããŸã ã åæ¹åã®ããŒã¿è»¢éãå¿ èŠãªå ŽåãåFlash Playerã¯ã©ã€ã¢ã³ãã¯ãéä¿¡ããNetStreamãšããŒã¿ãåä¿¡ããNetStreamãäœæããå¿ èŠããããŸãã
//
private var sendStream:NetStream;
sendStream = new NetStream(netConnection, NetStream.DIRECT_CONNECTIONS);
sendStream.addEventListener(NetStatusEvent.NET_STATUS, netStreamHandler);
sendStream.publish("media");
sendStream.attachAudio(Microphone.getMicrophone());
sendStream.attachCamera(Camera.getCamera());
//
private var recvStream:NetStream;
recvStream = new NetStream(netConnection, id_of_publishing_client);
recvStream.addEventListener(NetStatusEvent.NET_STATUS, netStreamHandler);
recvStream.play("media");
ãããŒããã£ã¹ããããŒããã£ã¹ã¿ãŒã¯ããããŒããã£ã¹ãããããŒã¿ãåä¿¡ã§ãããŠãŒã¶ãŒãçŽæ¥å¶åŸ¡ã§ããŸãã ã¯ã©ã€ã¢ã³ããå ¬éãããã¹ããªãŒã ã«ã¢ã¯ã»ã¹ããããšãããšãå ¬éãããNetStreamã§onPeerConnectïŒïŒã¡ãœãããåŒã³åºããïŒããã©ã«ãã§ã¯ãå®è£ ã¯åã«trueãè¿ããŸãïŒããã¢ã¯ããŒã¿ãžã®ã¢ã¯ã»ã¹ãååŸããŸãïŒãããçºçããªãããã«ããã®ã¹ããªãŒã ã«å¯Ÿããæš©éã«ã€ããŠã¯ã©ã€ã¢ã³ãïŒãã¢ïŒããã§ãã¯ã§ããŸããªããžã§ã¯ãã«ãã£ãŠã åãå ¥ãã ãïŒ
var o:Object = new Object();
o.onPeerConnect = function(subscriberStream:NetStream):Boolean {
if (accept) {
return true;
} else {
return false;
}
}
sendStream.client = o;
æŸéå±åŽã§ã¯ ã NetStream.peerStreamsã¯ãã¹ãŠã®çœ²åæžã¿ãã¢ã«å ±éã®ããããã£ã§ãã ããšãã°ã sendStream.sendïŒïŒã¡ãœããã䜿çšãããšããã¹ãŠã®ãã¢ã«å¯ŸããŠã¹ããªãŒã ãéä¿¡ãããŸãããç¹å®ã®åä¿¡è ã«ã¹ããªãŒã ãéä¿¡ããããšãã§ããŸãã
sendStream.peerStreams[i].send();
ä»ã«2ã€ã®ããããã£ã«èšåããå¿ èŠããããŸãããããã¯NetConnection.maxPeerConnectionsãšNetConnection.unconnectedPeerStreamsã§ãã
NetConnection.maxPeerConnections-ãããŒããã£ã¹ã¿ãŒãžã®æ¥ç¶ãèš±å¯ãããŠãããã¢ã®æ°ã決å®ããŸãã ããã©ã«ãã§ã¯ããã®ããããã£ã®å€ã¯8ã§ãããå®éã«ã¯ããã«å€ãã®å€ããããŸãã åFlash Playerã¯ã©ã€ã¢ã³ãã¯2ã€ã®ã¹ããªãŒã ãéåä¿¡ãããããå®å šãªãããã¯ãŒã¯ãäœæãããŸãã éåžžãããŠã³ããŒãã«ããã€ã³ã¿ãŒããããã£ãã«ã®å¹ ã¯ã¢ããããŒããããã¯ããã«å€§ããããã眲åããããã¢ããã®çä¿¡ãã£ãã«ãéè² è·ã«ããªãããã«éåžžã«æ³šæããå¿ èŠããããŸãã
ãããŒããã£ã¹ãããŒã¿ã¹ããªãŒã ã«ãŸã ãµãã¹ã¯ã©ã€ãããŠããªããã¢ã®é åã«å«ãŸããNetConnection.unconnectedPeerStreamsããããã£ã ç³èæŸéã«ãµã€ã³ã¢ãããããšããã¢åã¯ãã®é åããNetStream.peerStreamsé åã«ãªããŸã ã
ä»ã®ãšãããã¹ãŠã§ãã 远å ãããã®ã¯ã奜å¥å¿anyçãªäººãšåæ§ã«ãäžèšã®ãã¹ãŠã®ãããã³ã«æ©èœã確èªããããšã§ãã
ãã®ãã§ãã¯ã¯ãSirrus Serveräžã®ã¢ããªã±ãŒã·ã§ã³ã®äŸåé¢ä¿ã«ã€ããŠå®è¡ãããŸããã
Adobe Lab Webãµã€ãã«ã¯ãã Cirrusãµã³ãã«ã¢ããªã±ãŒã·ã§ã³ ããšããè¯ãäŸããããŸãã ãœãŒã¹ã¯ãããŠã³ããŒãããŠããŒã³å¥ã«ãœãŒãã§ããŸãïŒ http : //download.macromedia.com/pub/labs/cirrus/cirrus_app_assets_v5.zip
ãããã£ãŠãããã§ã¯ããã¹ãã¯ããŒã ãããã¯ãŒã¯ã§å®è¡ãããŸããã æåã«ãåºå®PCãä»ããŠã€ã³ã¿ãŒãããã«æ¥ç¶ãããã©ãããããããå ¥ããAdobe Labã®ãã®ãã¢ã§ç»é²ããæ¬¡ã«åºå®PCã§åãããšãè¡ããç»é²åã䜿çšããŠæ¥ç¶ãè¡ããã€ã³ã¿ãŒããããžã®ã¢ã¯ã»ã¹ãåæããŸããã å€å®ã15åïŒæããã«ãpeer_IDã§ã¹ããªãŒãã³ã°ããŒã¿ããããŒããã£ã¹ãããã©ã€ãã»ãã·ã§ã³ãéåžžã«å€ãïŒç°ãªããã·ã³ã«ã€ã³ã¹ããŒã«ããã2ã€ã®Webã«ã¡ã©éã®åªããæ¥ç¶ã ç§ã®èã®äžã®ãã®ãããªå°å ã®èªå·±ã¡ãã»ã³ãžã£ãŒã
ãã¹ãŠãçããã®å¹žéãç¥ã£ãŠããŸãã Habr-warriorsã®è»éãžã®æåŸ ãåŸ ã£ãŠããŸãã é »ç¹ã«æçš¿ããããšãçŽæããŸããããããã§ã...é¢çœããã®ãå ±æãããã§ãã