📌  相关文章
📜  rtcpeerconnection (1)

📅  最后修改于: 2023-12-03 15:34:45.174000             🧑  作者: Mango

RTCPeerConnection

RTCPeerConnection 是一个 WebRTC API 接口,用于在 Web 应用程序中创建对等连接(peer-to-peer connection)。

功能

RTCPeerConnection API 允许 Web 应用程序通过流媒体和数据传输来进行实时通信。它允许两个浏览器之间建立直接连接,而不需要中间服务器的干预。

RTCPeerConnection API 提供以下功能:

  • NAT(网络地址转换)穿透:使得浏览器可以通过 NAT 设备连接到互联网。
  • 视频和音频流的传输:支持在互联网上传输音频和视频流。
  • 数据流的传输:支持通过对等连接传输任何类型的数据,例如聊天消息或游戏数据。
  • 端到端加密:可以使用 Datagram Transport Layer Security(DTLS)协议保护流传输。
  • ICE(Interactive Connectivity Establishment) 候选项:RTCPeerConnection 使用 ICE 协议来查找最有效的传输路径,以便减少延迟并提高质量。
使用方法
创建 RTCPeerConnection 对象
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));
创造一个 offer
const offer = await peerConnection.createOffer();
await peerConnection.setLocalDescription(offer);
发送/接收 RTCSessionDescription

此时,我们可以将 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 应用程序可以通过流和数据通道实现实时通信,而无需通过传统的服务器中转。除了即时通讯应用程序之外,它还在视频和音频聊天、战略游戏、远程桌面等场景下发挥着重要作用。