HTML5 – Web RTC
随着互联网的普及和技术的不断发展,网络通信逐渐成为人们生活和工作必不可少的一部分。在在线聊天、远程会议、视频直播等场景中,实时传输音视频已经成为了一种必要的需求。Web RTC(Real-Time Communication)正是基于HTML5技术的一种实现方案,允许直接在浏览器中开发实时通信应用,支持音视频、文字等多种形式的数据传输。
Web RTC的实现方式
Web RTC是一组Javascript API,它们提供浏览器之间的音频、视频和数据点对点通信,免去了服务器端的中转,提供更快、更直接的连接方式。Web RTC包含了几个核心组件:
- MediaStream:用于获取摄像头、麦克风等的原始音视频数据。
-
RTCPeerConnection:用于构建点对点的连接通道,并将音视频数据传输给对端浏览器。
-
RTCDataChannel:用于实现点对点的数据通信,比如聊天、文件传输等。
在Web RTC的架构中,浏览器可以通过MediaStream API获得音视频数据,并通过流连接到RTCPeerConnection,从而实现点对点音视频传输。PeerConnection利用ICE协议和SDP协议建立通信双方之间的通道,从而实现点对点连接。
Web RTC的示例代码
下面,我们将展示如何在Web RTC中使用MediaStream和RTCPeerConnection来实现音视频通话的功能。为了简单起见,我们以Chrome浏览器作为演示平台,示例代码为Javascript。
获取视频流
要实现视频通话,首先需要获取用户的视频流。下面的代码展示了如何通过getUserMedia方法获取用户的视频流:
navigator.getUserMedia = navigator.getUserMedia ||
navigator.webkitGetUserMedia || navigator.mozGetUserMedia ||
navigator.msGetUserMedia;
if (navigator.getUserMedia) {
navigator.getUserMedia({video: true}, function(stream) {
var video = document.querySelector('video');
video.srcObject = stream;
video.onloadedmetadata = function(e) {
video.play();
};
}, function(err) {
console.log("The following error occurred: " + err.name);
});
} else {
console.log("getUserMedia not supported");
}
在上述代码中,我们使用navigator.getUserMedia
方法获取用户视频流,此方法为getUserMedia为标准方法,可能在不同的浏览器中有不同的前缀,因此代码中对navigator
对象进行了多个属性做兼容。同时设置video
为true表示该流中包含视频流。
建立点对点连接
获取到视频流之后,接下来就需要建立点对点连接了。点对点连接涉及到的关键概念有:
- ICE(TRICKLE)代理
- SDP协议
ICE代理是指由WebRTC API 自动选择的指定 NAT(Network Address Translator) 网关和防火墙穿越技术的集合。 SDP协议则主要负责描述音视频数据的格式和众多其他与握手相关的信息。
下面是一个建立WebRtc连接的函数:
function startPeerConnection() {
myPeerConnection = new RTCPeerConnection(configuration);
// Setup ice handling
myPeerConnection.onicecandidate = function(event) {
if (event.candidate) {
sendMessage({type: "candidate", candidate: event.candidate});
}
};
// Once remote stream arrives, show it in the remote video element
myPeerConnection.onaddstream = function(event) {
remoteVideo.srcObject = event.stream;
};
// Get user media
navigator.getUserMedia({video: true, audio: true}, function(stream) {
localStream = stream;
// Add localStreamto video element
localVideo.srcObject = stream;
// Add stream to peer connection
myPeerConnection.addStream(stream);
doCall();
}, function(error) {
console.log(error);
});
}
在这个代码片段中,我们首先创建了一个RTCPeerConnection对象,它将在本地用户和远程用户之间建立点对点连接。然后,我们设置了onicecandidate监听器来处理ICE事件,同时设置了onaddstream监听器以处理远程流的到达事件。
接下来,我们调用navigator.getUserMedia来获取当前浏览器的用户媒体流,然后将本地视频流添加到我们的PeerConnection中。最后,我们调用doCall方法来建立连接。
发送和接收信令
在Web RTC中建立连接的过程中,需要通过信令通道交换SDP和ICE信息。这些信令允许连接对等方了解如何连接到另一个对等方。Web RTC没有定义信令,因此我们必须自己确定信令通道,并处理消息传输的细节。
下面是一个sendData函数,用于向对端发送SDP或ICE信息:
function sendData(message) {
var msgString = JSON.stringify(message);
console.log('Sending message: ' + msgString);
connection.send(msgString);
}
在此示例代码中,我们只是简单地将传递的消息转换成JSON格式,并通过数据通道将其发送给远程对等方。
处理连接请求
当两个对等方链接到同一聊天的WebRTC Web端点时,步骤顺序是这样的:
- 首先要建立两个Peers之间通信所需要的信息,并通过信令服务器将其传递给另一方。
-
然后,另一方会收到连接请求,其需要知道有另一个Peers想要和它建立联系。你需要允许另一方与你进行通信,以便两者之间可以进行视频/音频通话或文本聊天。
下面是一个处理连接请求的函数:
function handleIncomingCall() {
// Answer the call
myPeerConnection = new RTCPeerConnection(configuration);
// Setup ice handling
myPeerConnection.onicecandidate = function(event) {
if (event.candidate) {
sendMessage({type: "candidate", candidate: event.candidate});
}
};
// Once remote stream arrives, show it in the remote video element
myPeerConnection.onaddstream = function(event) {
remoteVideo.srcObject = event.stream;
};
// Get user media
navigator.getUserMedia({video: true, audio: true}, function(stream) {
localStream = stream;
// Add localStream to video element
localVideo.srcObject = stream;
// Add stream to peer connection
myPeerConnection.addStream(stream);
// Answer the call with the SDP
myPeerConnection.setRemoteDescription(new RTCSessionDescription(remoteSDP), function() {
myPeerConnection.createAnswer(function(description) {
myPeerConnection.setLocalDescription(description, function(){
sendMessage({type: "answer", answer: description});
});
});
});
}, function(error) {
console.log(error);
});
}
在上述代码中,我们首先建立了一个RTCPeerConnection对象,设置ice事件监听器和remote stream到达事件监听器。然后,我们调用getUserMedia方法来获取当前浏览器的用户媒体流,并将本地视频流添加到我们的PeerConnection中。接下来,我们使用setRemoteDescription方法设置远程SDP,并通过createAnswer方法来回应请求。
结论
Web RTC技术的崛起已经使得基于Web的实时通讯变得更加简单和普及。使用HTML5技术通过JavaScript实现实时音视频通信,同时不依赖任何插件,用户体验更佳,更具可用性。本文简要介绍了Web RTC的使用方法,希望对开发者们有所启发,促进Web RTC技术应用的发展和进步。Web RTC在音视频通信领域的应用前景不可估量,未来将会有更多基于Web RTC的实时通讯应用和新的技术应用场景的出现。