WEBRTC 笔记
WEBRTC 是什么
它的全称是WEB Real-time communication。一开始我还以为是一种通信技术。这里的communication主要是人与人之间的,所以它解决了在网页视频、音频的播放和获取的问题。它的目标是希望用户之间直接通信,而不是通过服务器来进行交互。简单地说就是在浏览器上实现视频通话,而且最好不需要中央服务器。
大家应该仔细看看这个教程 ,我希望这篇笔记可以更快地帮助大家理解,说明一下比较容易困惑的点,少走一些弯路,而不是取代这篇教程。
核心技术
getUserMedia() : 获取视频和音频。
MediaRecorder : 记录视频和音频。
RTCPeerConnection : 建立视频流。
RTCDataChannel : 建立数据流。
实际问题
然而在现实中网络是不通畅的,2个浏览器之间无法直接建立连接,甚至都无法发现对方。为此需要额外的技术来完成连接。
建立连接
JSEP:
首先创建 RTCPeerConnection 对象,仅仅是初始化。
使用 createOffer/createAnswer 来交换SDP,sdp中包含网络信息,RTCPeerConnection 对象得以建立连接。
激活onicecandidate完成连接。
WEBRTC没有规定createOffer/createAnswer时使用的协议,因此signaling server 只要可以与浏览器交换SDP即可。可以用socket.io/wensocket等通信技术把createOffer/createAnswer中的SDP给送到对方手里就好了。
下面我将用一个简单的例子来说明连接是如何建立的。
为了更好地说明信号服务器的作用,我把它直接给拿掉了。取而代之的是一块公告牌。
在sendMessage
和receiveMsg
中,将要发送的信息写在页面的msg下方。没错,人工复制即可。
首先打开2个页面,一个主动方点击call,另一个被动方点击recv
将caller的消息复制到receiver的answer按钮边上的文本框内,再点击answer。
将receiver的消息复制到caller的answer按钮边上的文本框内,再点击answer。
点击send将send左边的文本发送到对方send右侧的文本框内。
概述:
创建对象 。
绑定回调函数。
peerConn = new RTCPeerConnection(pcConfig); peerConn.onicecandidate = handleIceCandidate; dataChannel = peerConn.createDataChannel('1'); channel.onopen = function() { console.log('CHANNEL opened!!!'); }; channel.onmessage = function(event){ remoteText.innerText = event.data; };
提供服务:createOffer。
这期间要发送offer,candidate消息。 `peerConn.createOffer(onLocalSessionCreated, logError);` 在`onLocalSessionCreated`中调用`sendMessage`。 随后会触发`handleIceCandidate`调用`sendMessage`。
创建应答: createAnswer。
peerConn.setRemoteDescription(new RTCSessionDescription(message), function() {}, logError); peerConn.createAnswer(onLocalSessionCreated, logError);
注意,这一步是在receiver端进行的。 跟createOffer类似,createAnswer会发送一个answer消息,随后发送candidate消息。
添加candidate
peerConn.addIceCandidate(new RTCIceCandidate({ candidate: message.candidate }));
连接建立