📅  最后修改于: 2020-10-23 06:22:17             🧑  作者: Mango
万维网联盟(W3C)引入的Web RTC。它支持用于语音呼叫,视频聊天和P2P文件共享的浏览器到浏览器应用程序。
如果要尝试一下?适用于Chrome,Opera和Firefox的Web RTC。一个不错的起点是此处的简单视频聊天应用程序。 Web RTC实现了三个API,如下所示-
MediaStream-可以访问用户的摄像头和麦克风。
RTCPeerConnection-获得对音频或视频呼叫功能的访问。
RTCDataChannel-可以访问对等通信。
MediaStream表示同步的媒体流,例如,单击HTML5演示部分中的HTML5视频播放器,否则单击此处。
上面的示例包含stream.getAudioTracks()和stream.VideoTracks()。如果没有音轨,它将返回一个空数组,并将检查视频流。如果已连接网络摄像头,stream.getVideoTracks()将返回一个MediaStreamTrack数组,该数组表示来自网络摄像头的流。一个简单的示例是聊天应用程序,聊天应用程序从网络摄像头,后置摄像头,麦克风中获取信息流。
function gotStream(stream) {
window.AudioContext = window.AudioContext || window.webkitAudioContext;
var audioContext = new AudioContext();
// Create an AudioNode from the stream
var mediaStreamSource = audioContext.createMediaStreamSource(stream);
// Connect it to destination to hear yourself
// or any other node for processing!
mediaStreamSource.connect(audioContext.destination);
}
navigator.getUserMedia({audio:true}, gotStream);
在带有mediaStreamSource的Chrome浏览器中,这也是可能的,并且需要HTTPS。此功能在歌剧中尚不可用。此处提供示例演示
Web RTC要求浏览器之间进行对等通信。该机制需要信令,网络信息,会话控制和媒体信息。 Web开发人员可以选择不同的机制在浏览器之间进行通信,例如SIP或XMPP或任何两种方式的通信。 XHR的示例示例在此处。
var signalingChannel = createSignalingChannel();
var pc;
var configuration = ...;
// run start(true) to initiate a call
function start(isCaller) {
pc = new RTCPeerConnection(configuration);
// send any ice candidates to the other peer
pc.onicecandidate = function (evt) {
signalingChannel.send(JSON.stringify({ "candidate": evt.candidate }));
};
// once remote stream arrives, show it in the remote video element
pc.onaddstream = function (evt) {
remoteView.src = URL.createObjectURL(evt.stream);
};
// get the local stream, show it in the local video element and send it
navigator.getUserMedia({ "audio": true, "video": true }, function (stream) {
selfView.src = URL.createObjectURL(stream);
pc.addStream(stream);
if (isCaller)
pc.createOffer(gotDescription);
else
pc.createAnswer(pc.remoteDescription, gotDescription);
function gotDescription(desc) {
pc.setLocalDescription(desc);
signalingChannel.send(JSON.stringify({ "sdp": desc }));
}
});
}
signalingChannel.onmessage = function (evt) {
if (!pc)
start(false);
var signal = JSON.parse(evt.data);
if (signal.sdp)
pc.setRemoteDescription(new RTCSessionDescription(signal.sdp));
else
pc.addIceCandidate(new RTCIceCandidate(signal.candidate));
};