±à¼ÍƼö: |
ÎÄÕ¼òµ¥µÄ˵Ã÷WebRTC
µÄÈýÖÖÈÎÎñ,ÈýÖÖÖ÷ÒªµÄJavaScript APIs,MediaStream,getUserMedia
+ Web Audio,Ï£Íû¶ÔÄúÓÐËù°ïÖú
±¾ÎÄÀ´×ÔÓÚcsdn£¬ÓÉ»ðÁú¹ûÈí¼þDelores±à¼ÍƼö |
|
WebRTC µÄÈýÖÖÈÎÎñ
»ñÈ¡ÒôƵºÍÊÓÆµ
´«´ïÒôƵºÍÊÓÆµ
´«´ïÈÎÒâÊý¾Ý
ÈýÖÖÖ÷ÒªµÄJavaScript APIs
MediaStream(aka getUserMedia)
RTCPeerConnection
RTCDataChannel
MediaStream
´ú±íÒ»ÖÖ ÒôƵ »òÕß/ºÍ ÓïÒôÁ÷.
¿ÉÒÔ°üº¬¶à¸ö ¡°tracks¡±
ͨ¹ý navigator.getUserMedia() »ñȡһ¸ö MediaStream

MediaStream
aka getUserMedia
var constraints
= {video: true};
function successCallback(stream) {
var video = document.querySelector ("video");
video.src = window.URL.createObjectURL (stream);
}
function errorCallback(error) {
console.log ("navigator.getUserMedia error:",
error);
}
navigator.getUserMedia (constraints, successCallback,
errorCallback); |
Constraints
Controls the contents of the MediaStream
Media type, resolution, frame rate
video: {
mandatory: {
minWidth: 640,
minHeigh: 360
},
optional [{
minWidth: 1280,
minHeigth: 720
}]
} |
getUserMedia + Web Audio
// success callback
when requesting audio input stream
function gotStream(stream) {
var audioContext = new webkitAudioContext();
// create an AudioNode from the stream
var mediaStreamSource = audioContext. createMediaStreamSource(stream);
// connect it to the destination or any other
node for processing!
mediaStreamSource.connect (audioContext.destination);
}
|
È·±£´ò¿ªÁËChrome ä¯ÀÀÆ÷ÀïÃæ about:flags ÀïÃæµÄ Web Audio Input
»ñÈ¡Óû§ÇÐͼ gUM screencapture
var constraints
= {
video: {
mandatory: {
chromeMediaSource: 'screen'
}
}
}
navigator.webkitGetUserMedia (constraints, gotStream); |
RTCPeerConnection
audio ºÍ video µãµ½µãÖ®¼äµÄÁ´½ÓͨÐÅ
Communicate Media Streams

RTCPeerConnection ×öÁ˺ܶà
ÐÅÁî´¦Àí
½âÂë²Ù×÷
¶Ëµ½¶ËµÄͨÐÅ
°²È«
´ø¿í¿ØÖÆ
WebRTC ¼Ü¹¹

RTCPeerConnection ÑùÀý
pc = new RTCPeerConnection(null);
pc.onaddstream = gotRemoteStream;
pc.addStream(localStream);
pc.createOffer(gotOffer);
function gotOffer(desc) {
pc.setLocalDescription(desc);
sendOffer(desc);
}
function getAnswer(desc) {
pc.setRemoteDescription(desc);
}
function getRemoteStream(e) {
attachMediaStream(remoteVideo, e.stream);
} |
RTCDataChannel
¶Ëµ½¶ËÖ®¼äµÄÈÎÒâÊý¾ÝµÄË«ÏòͨÐÅ

RTCDataChannel
Same API as WebSocket
Ultra-low lantency ³¬µÍÑÓ³Ù
Unreliable or reliable ¸ù¾ÝÓ¦Óó¡¾°Ñ¡ÔñÊÇËÙ¶ÈÖØÒª£¬»¹Êǿɿ¿ÐÔÖØÒª¡£±ÈÈç´«Îļþ£¬ÐèÒª¸ã¿É¿¿ÐÔ¡£¶ø´«ÓÎÏ·Êý¾Ý£¬Êý¶È¸üÖØÒª¡£
Secure ±£Ö¤´«ÊäµÄÊý¾ÝÔÚ½ÓÊÕºóÄܹ»ÒÔÕýÈ·µÄ·½Ê½½âÂë¡£
RTCDataChannel API
var pc = new
webkitRTCPeerConnection (servers, {optional: [{RtpDataChannels:
true}]};
pc.ondatachannel = function(event) {
receiveChannel = event.channel;
receiveChannel.onmessage = function (event) {
document.querySelector("div#receive"). innerHTML
= event.data;
};
};
sendChannel = pc.createDataChannel ("sendDataChannel",
{reliable: false});
document.querySelector("button#send"). onclick
= function() {
var data = document.querySelector ("textarea#send").value;
sendChannel.send(data);
}; |
Servers and Protocols
Peer to Peer - µ«ÊÇÎÒÃÇÐèÒª·þÎñÆ÷.
Abstract Signaling
ÐèÒª½»»» ¡®session description¡¯ objects.
ÎÒÖ§³ÖʲôÑùµÄ¸ñʽ£¬ÎÒÏëÒª·¢ËÍʲô
¶Ëµ½¶ËÖ®¼ä½¨Á¢Á´½Óʱ£¬ÐèÒªµÄÍøÂçÐÅÏ¢
¿ÉÒÔʹÓÃÈÎÒâ messaging mechanism,±ÈÈç: web sockets£¬ Google Cloud Messaging, XHR
¿ÉÒÔʹÓÃÈÎÒâ messaging protocol . ±ÈÈ磺JSON£¬»òÕß±ê×¼µÄÐÒ飺 SPI XMPP¡£
Signaling Diagram

An RTCSessionDescription

STUN and TURN
P2P in the age of firewalls and NATs
¶Ëµ½¶ËÖ®¼ä session ÍêÕûµÄ·¾¶¡£
ÔÚºÜÔçÒÔǰ£¬Õâ²»ÊÇÎÊÌâ¡£ÈËÃÇÖªµÀ¶Ô·½µÄ¹«ÍøIPµØÖ·¾Í¿ÉÒÔÖ±½ÓÁ¬½Ó½øÐÐͨÐÅ¡£

µ«ºóÀ´ÓÐÁËNAT, NAT·Ö·¢ËùνµÄ˽ÓÐIPµØÖ·.¶øË½ÓÐIPµØÖ·²»ÄÜÓÃÓÚ½¨Á¢Á´½ÓͨÐÅ¡£ÎÒÃǾÍÎÞ·¨½¨Á¢ÕæÕýµÄ¶Ëµ½¶ËͨÐÅ¡£³ý·ÇÎÒÃÇÓй«¹²µØÖ·¡£ËùÒÔÒýÈëÁËSTUN¼¼Êõ¡£

STUN
¸æËßÎÒÎҵĹ«ÍøIPµØÖ·ÊǶàÉÙ. µ±Ò»¸örequest ·¢Ë͵½STUN ServerµÄʱºò£¬STUN Server²é¿´Õâ¸öÇëÇóµÄÀ´Ô´µØÖ·£¬²¢°ÑµØÖ··Åµ½ packetÀïÃæ£¬È»ºó·¢»ØÈ¥¡£ËùÒÔÏÖÔÚWebRTC ÖªµÀ Peer µÄ¹«ÍøIPµØÖ·ÁË£¬Ö®ºóSTUN server ¾Í²»»á²ÎÓëµ½ Peer Óë Peer Ö®¼äµÄͨÐÅÁ´Â·ÖÐÈ¥ÁË¡£Ò²¾Í²»ÐèҪת·¢ media¡£
Ò»¸ö¼òµ¥µÄ Server£¬ÔËÐгɱ¾µÍ
Data flows peer-to-peer

ͨ³£Çé¿öÏ£¬ÊÇ¿ÉÒÔ½¨Á¢Í¨Ðŵ쬵«²»ÊÇÔÚËùÓеÄÇé¿ö϶¼ÄÜÕý³£¹¤×÷¡£ËùÒÔÒýÈëÁËTURN ¼¼Êõ¡£
TURN
Èç¹û peer-to-peer ͨÐÅʧ°ÜµÄ»°£¬Ìṩһ¸ö cloud fallback.
µ±ÎÞ·¨½¨Á¢¶Ëµ½¶ËµÄÁ´½Óʱ£¬×ª¶øµ÷ÓÃÔÆ·þÎñÖÐµÄ relay¡£ÇëÇ󣺸øÎÒÒ»¸ö¹«¹²µÄIPµØÖ·¡£ÓÉÓÚÕâ¸ö¹«¹²µØÖ·ÊÇÔÚÔÆ·þÎñÉÏ¡£ÈκÎÈ˶¼¿ÉÒÔºÍËû½¨Á¢Á´½Ó¡£Ò²¾ÍÒÔΪ×ÅÕâ¸öcall¿ÉÒÔ½¨Á¢ÆðÀ´¡£¼´Ê¹ÄãÔÚÒ»¸öÊÜÏÞÖÆµÄÍøÂç»·¾³ÖУ¬ÉõÖÁÔÚÒ»¸öÍøÂç´úÀíºóÃæ¡£
Êý¾ÝÊÇͨ¹ý server ·¢Ë͵ģ¬Ê¹Óà server µÄ´ø¿í
ȱµãÊÇ£¬ÓÉÓÚÊý¾Ýʵ¼ÊÉÏÊÇͨ¹ý·þÎñÆ÷Öм̵ģ¬Òò´Ë»á²úÉúÔËÓª³É±¾¡£µ«ÕâÒâζ×ÅÕâ¸öͨ»°¿ÉÒÔÔÚ¼¸ºõËùÓеÄÍøÂç»·¾³ÏÂÕý³£µÄ¹¤×÷¡£
È·±£ call ¿ÉÒÔÔÚ¾ø´óÊýÍøÂç»·¾³ÏÂÕý³£¹¤×÷¡£

ÏÖÔÚ£¬Ò»·½Ã棬ÎÒÃÇÓÐSTUN£¬Ëü³¬¼¶±ãÒË£¬µ«Ãæ¶Ô¸´ÔÓµÄÍøÂç»·¾³£¬»á²»¿ÉÓá£ÎÒÃÇÓÐTURN¡£Ëûͨ³£¶¼¿ÉÓᣵ«»áÕ¼Ó÷þÎñÆ÷µÄ´ø¿í¡£ÕâÁ½ÖÖ·½°¸£¬ÈçºÎÑ¡Ôñ×îºÃµÄ·½°¸ÄØ£¿
Ïȳ¢ÊÔʹÓÃSTUN Server ½¨Á¢Á´½Ó£¬Èç¹û²»ÐУ¬ÎÒÃÇÎÞ·¨´©Í¸NATs. sËùÒÔ£¬ÎÒÃǻعýÍ·À´£¬½Ó×ÅÎÒÃÇΨһÄÜÓõÄÊÇTURN£¬°Ñ media Êý¾Ý´ÓÎÒÃǵķ¢Æð peer£¬ ¾¹ýNAT£¬ ÔÙ¾¹ý TURN server ·¢Ë͸øÁíÒ»¶ËµÄ peer. ÕâЩ¶¼ÊÇͨ¹ý ICE ¼¼ÊõʵÏֵġ£
ICE
ICE£º Ò»¸öÓÃÓÚÁ´½Ó Peers µÄ¿ò¼Ü¡£
³¢ÊÔΪÿһ¸ö call ÕÒµ½×î¼ÑµÄͨÐÅ·¾¶¡£
¾ø´ó¶àÊý calls ¶¼¿ÉÒÔʹÓà STUN

²¿Êð STUN/TURN
stun.l.google.com:19302
WebRTC stunserver, turnserer ½¨ÒéÈ¡ÃûµÄʱºò£¬È¡Ò»¸ö³¤³¤µÄÃû×ÖÒÔÈ·±£Î¨Ò»ÐÔ¡£
rfc5766-turn-server ËûÓÐ Amazon VM ¾µÏñ¡£Äã¿ÉÒÔÏÂÔØÏÂÀ´£¬²¿Êðµ½ÔÆ·þÎñÆ÷ÉÏÈ¥£¬Äã¾Í¿ÉÒÔ¸øÄãµÄÓû§Ìṩ TURN server ÁË¡£
restund ÁíÍâÒ»¸ö TURN server£¬ÎÒÃÇʹÓùý£¬Ð§¹ûºÜºÃ¡£
WebRTC code package ÀïÃæÓÐ STUN ºÍ TURN µÄÔ´´úÂë¡£
°²È« Security
ÔÚWebRTC¿ªÊ¼µÄʱºò£¬¾Í¿¼ÂÇÁ˰²È«ÎÊÌâ
Ç¿ÖÆ¼ÓÃÜ media ºÍ data . ËùÓд«ÊäµÄÊý¾Ý¶¼Ê¹Óñê×¼µÄ AES ¼ÓÃÜ¡£
Secure UI, explicit opt-in . Ö»ÓÐÓû§Ã÷È·µØÑ¡ÔñÁËʹÓÃÂó¿Ë·çºÍÉãÏñÍ·£¬WebRTC²Å¿ÉÒÔÓÃÕâЩ¹¦ÄÜ¡£
Sanboxed£¬ no plugins. WebRTC ÔËÐÐÔÚChrome ä¯ÀÀÆ÷µÄ ɳºÐ ÀïÃæ¡£
ËùÒÔ¼´Ê¹ÓÐÈËÊÔͼ¹¥»÷chromeÀïÃæµÄwebRTC. ä¯ÀÀÆ÷ºÍÓû§¶¼»áµÃµ½ÍêÕûµÄ±£»¤¡£
WebRTC Security Architecture WebRTC °²È«¼Ü¹¹
Secure pathways °²È«µÄ´«Ê䷽ʽ
Signaling ÓÃHTTPS¼ÓÃÜ
Audio/Video ʹÓÃSRTP¼ÓÃÜ
Data ʹÓÃDTLS(Datagram TLS) ¼ÓÃÜ

Architecutres
Èç¹ûÓжà¸öcall£¬±ÈÈçÒ»¸ö¶à·½»áÒ飬ÎÒÓ¦¸ÃÈçºÎ¹¹½¨ÎÒµÄÓ¦ÓóÌÐò£¿
Peer to Peer: 1 ¶Ô 1 µÄ call

Mesh(Íø¿×):СÐ͵Ķ෽»áÒé.
Mesh ±íʾÿһ¸öpeer ¶¼»áÁ¬½Óµ½ÁíÍâËùÓÐµÄÆäËûpeer¡£

ÕâÑùÒ²ºÜ¼òµ¥£¬ÒòΪËûÃÇÖ®¼äµÄÁ´½Ó²»Éæ¼°·þÎñÆ÷·þÎñÆ÷ºÍÆäËû¶«¶«,±ÈÈçÐÅÁî¡£µ«ÓÐȱµã: ¼ÙÉèÓÐN¸öPeer²ÎÓëͨÐÅ£¬Ã¿Ò»¸öPeerÒª·¢Ë͵ÄÊý¾Ý£¬±ØÐ뽫Êý¾Ý¸´ÖÆN-1·Ö£¬·Ö±ð·¢Ë͸øÆäËûN-1¸öPeer. Õ⽫ÓжÔÓ¦µÄCPUºÍ´ø¿íÏûºÄ¡£ËùÒÔÕâÈ¡¾öÓÚÄãÒª·¢Ë͵ÄmediaÀàÐÍ¡£¶ÔÓÚAudio£¬¿ªÏúÒª´óһЩ¡£¶ÔÓ¦Video£¬¿ªÏúҪСһЩ¡£ÍØÆËͼÖвÎÓëͨ»°µÄPeersÊýÁ¿Òò´Ë»áÊÕµ½ÏÞÖÆ. Èç¹ûijһ¸öPeerÊÇÊÖ»úÉ豸¡£CPUºÍ´ø¿í³Ô½ô¡£ÏÞÖÆ¸üÃ÷ÏÔ¡£
ΪÁ˽â¾öÕâ¸öÎÊÌ⣬ÒýÈëÁíÍâÒ»Öּܹ¹¡£
Star: medium N-way call ÐÇÐμܹ¹

´ÓËùÓÐpeerÀïÃæÕÒµ½Ò»¸öÐÔÄÜ×îÇ¿µÄ¡£ÓÉËü´Óµ±»á»°µÄÖÐÐĽÇÉ«¡£ÎÒÃdzÆÖ®Îª the focus for the call. foucs ʵ¼Ê¸ºÔð½ÓÊÕÊý¾Ý£¬¸´ÖƲ¢×ª·¢¸øËùÓÐÆäËûPeers »òÕß endpoints. µ«ÊÇÎÒÃÇÒª´¦Àí¶à·½µÄ¸ßÇåÊÓÆµÁ÷(HD video streams). focus µÄÈÎÎñ¾ÍÓеã³Ô²»ÏûÁË¡£ËùÒÔ¶ÔÓÚ´óÐ͵Ķ෽»á»°£¬ÐèҪʹÓÃMCU¡£
MCU multipoint control unit. ¶àµã¿ØÖƵ¥Ôª

MCU ÊÇÒ»¸öΪ´«µÝ´óÁ¿ÒôƵºÍÊÓÆµ¶ø¶¨ÖƵķþÎñÆ÷¡£Ëü¿ÉÒÔ×ö¸÷ÖÖÊÂÇé. Ëü¿ÉÒÔÑ¡Ôñ stream ²¢×ª·¢. Ëüʵ¼ÊÉÏ¿ÉÒÔ»ìºÏÒôƵ»òÊÓÆµÊý¾Ý¡£Ëü»¹ÄÜÂ¼ÖÆ¡£Èç¹ûÒ»¸öPeer µôÏßÁË£¬MCU²»»áÖжÏÕû¸ö»áÒ飬ÒòΪMCUÒª¸ºÔðËùÓеÄPeerµÄ»á»°£¬¶ø²»µ¥µ¥ÊÇijһ¸öPeer¡£
Beyong browers ²»½ö½öÏÞÖÆÓÚÔÚä¯ÀÀÆ÷ÖÐʹÓá£
Phones and more
ÈÝÒ׺ͷÇä¯ÀÀÆ÷É豸¼¯³É
sipML5 ¿ªÔ´µÄ JavaScript SPI client. ¿ÉÒÔÓÃÓÚ±ê×¼µÄSIPÉ豸¡£
Phono ¿ªÔ´µÄ JavaScript phone API
Zingaya embeddable phone widget
Zingaya PSTN
´´½¨Ò»¸ö WebRTC app
chrome://webrtc-internals
ÔÚÕâÀï¿ÉÒÔ¿´µ½webRTC API µ÷ÓõÄÈÕÖ¾£¬Äã¿ÉÒÔdebug.

adapter.js
ÈÃÄãÔÚËùÓа汾µÄä¯ÀÀÆ÷ÀïÃæÊ¹ÓÃͬÑùµÄ´úÂë
ÒÆ³ýÁ˳§ÉÌǰ׺(vendor prefixes)
½« Chrome/Firefox µÄ²îÒì×öÁ˳éÏó´¦Àí¡£
×î´óÏ޶ȵؼõÉٹ淶Á÷ʧµÄÓ°Ïì(minimizes effects of spec chrun)
ʵ¼ÊÉÏ webRTC ¹æ·¶µÄ¸üÐÂÆµÂʷdz£¿ì£¬¶ÔÓÚÒ»¸öÌØ¶¨µÄä¯ÀÀÆ÷£¬ÕâЩAPI ²»ÄÜһֱƥÅä×îа汾µÄ¹æ·¶¡£adapter.js¿ÉÒÔ°ïÖúWeb¿ª·¢ÈËÔ±¸ôÀëä¯ÀÀÆ÷Ö®¼äµÄ²îÒìºÍ°æ±¾Ö®¼äµÄ²îÒì¡£Òò´ËÎÒÃÇÈ·±£adapter.jsʼÖÕʵÏÖ×îеĹ淶£¬È»ºóÏòÏ·¢Ë͵½°æ±¾Ö§³ÖµÄÈκÎÄÚÈÝ¡£ËùÒÔеÄAPI·¢²¼µÄʱºò£¬²»ÐèÒª¸ü¸Ä¿ª·¢ÈËÔ±µÄ´úÂ룬ֻÐèÒª¸üÐÂÒ»ÏÂadapter.js Îļþ¾Í¿ÉÒÔÁË¡£
JavaScript frameworks
Video chat:
SimpleWebRTC
easyRTC
webRTC.io
Peer-to-peer data:
PeerJS
Sharefest
SimpleWebRTC
ºÜ·½±ãµÄ peer-to-peer ÊÓÆµºÍÓïÒô
var webrtc =
new WebRTC ({
localVideoEl: 'localVideo',
remoteVideosEl: 'remoteVideos',
autoRequestMedia: true
});
webrtc.on('readyToCall', function (){
webrtc.joinRoom('My room name');
}); |
PeerJS
·½±ãµÄ peer-to-peer data
var peer = new
Peer('someid', {key: 'apikey'});
peer.on('connection', function(conn) {
conn.on('data', function(data) {
// will print 'hi!'
console.log(data);
});
});// connecting peer
var peer = new Peer('anotherid', {key: 'apikey'});
var conn = peer.connect('someid');
conn.on('open', function() {
conn.send('hi!');
}); |
javascript ²¢²»ÓùØÐIJúÆ··½ÃæµÄ·þÎñÌØÐÔ£¬±ÈÈç ÐÅÁSTUN ºÍ TURN ·þÎñ¡£ÐÒÔ˵ÄÊÇ£¬OpenTok ºÍ vLine¡¡ÎªÎÒÃÇÌṩÁËÕâЩ·þÎñ¡£ÄãÖ»ÐèҪע²áÕâЩ·þÎñ£¬»ñÈ¡API key, ¾Í¿ÉÒÔʹÓÃËûÃǵIJúÆ·¹¦ÄÜ·¢Æð call. ´¥´ïÊÀ½çµÄÿ¸ö½ÇÂä¡£ËûÃÇ»¹ÖÆ×÷ÁË¿ÉÒÔÇáËÉ·ÅÈëWebRTCÓ¦ÓóÌÐòµÄUIС²¿¼þ.ËùÒÔÄãÄÜ¿ìËٵĿª·¢ºÍÔËÐÐ WebRTC app.
Services
Íê³É video services:
OpenTok (acuqired by Telefonica Digital)
vLine
×îаæchrome ÒѾ֧³Ö HD video quality ºÍ full-band audio quality.
|