Äú¿ÉÒÔ¾èÖú£¬Ö§³ÖÎÒÃǵĹ«ÒæÊÂÒµ¡£

1Ôª 10Ôª 50Ôª





ÈÏÖ¤Â룺  ÑéÖ¤Âë,¿´²»Çå³þ?Çëµã»÷Ë¢ÐÂÑéÖ¤Âë ±ØÌî



  ÇóÖª ÎÄÕ ÎÄ¿â Lib ÊÓÆµ iPerson ¿Î³Ì ÈÏÖ¤ ×Éѯ ¹¤¾ß ½²×ù Model Center   Code  
»áÔ±   
   
 
     
   
 ¶©ÔÄ
  ¾èÖú
webRTC¼ò½é
 
×÷Õߣº mysonghushu
  2096  次浏览      32
 2020-3-9
 
±à¼­ÍƼö:
ÎÄÕ¼òµ¥µÄ˵Ã÷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.

   
2096 ´Îä¯ÀÀ       32
????

HTTP????
nginx??????
SD-WAN???
5G?????
 
????

??????????
IPv6???????
??????????
???????
????

????????
????????
???????????????
??????????