📅  最后修改于: 2023-12-03 15:34:45.174000             🧑  作者: Mango
RTCPeerConnection 是一个 WebRTC API 接口,用于在 Web 应用程序中创建对等连接(peer-to-peer connection)。
RTCPeerConnection API 允许 Web 应用程序通过流媒体和数据传输来进行实时通信。它允许两个浏览器之间建立直接连接,而不需要中间服务器的干预。
RTCPeerConnection API 提供以下功能:
const configuration = {iceServers: [{urls: "stun:stun.l.google.com:19302"}]};
const peerConnection = new RTCPeerConnection(configuration);
const stream = await navigator.mediaDevices.getUserMedia({audio: true, video: true});
stream.getTracks().forEach(track => peerConnection.addTrack(track, stream));
const offer = await peerConnection.createOffer();
await peerConnection.setLocalDescription(offer);
此时,我们可以将 offer
发送给远程浏览器,并等待其回复。
// 发送方
const answer = await signalingChannel.sendOffer(offer);
await peerConnection.setRemoteDescription(answer);
// 接收方
const offer = await signalingChannel.waitForOffer();
await peerConnection.setRemoteDescription(offer);
const answer = await peerConnection.createAnswer();
await peerConnection.setLocalDescription(answer);
signalingChannel.sendAnswer(answer);
在交换 RTCSessionDescription 后,我们可以选择从远程源添加音频和/或视频。这将启动 ontrack
事件。
peerConnection.ontrack = event => {
const video = document.getElementById("remoteVideo");
video.srcObject = event.streams[0];
};
除了媒体流,我们还可以通过传输任何类型的数据来进行实时通信:
// 发送方
const dataChannel = peerConnection.createDataChannel("chat");
dataChannel.send("Hello, world!");
// 接收方
peerConnection.ondatachannel = event => {
const dataChannel = event.channel;
dataChannel.onmessage = event => {
const message = event.data;
console.log(`Received message: ${message}`);
};
};
RTCPeerConnection API 使 Web 应用程序可以通过流和数据通道实现实时通信,而无需通过传统的服务器中转。除了即时通讯应用程序之外,它还在视频和音频聊天、战略游戏、远程桌面等场景下发挥着重要作用。