当前位置:首页 > JavaScript

webrtc js实现

2026-02-01 22:55:48JavaScript

WebRTC JavaScript 实现

WebRTC(Web Real-Time Communication)是一种支持浏览器实时通信的开放标准。以下是通过 JavaScript 实现 WebRTC 的关键步骤和技术要点。

建立连接

WebRTC 的核心是建立点对点(P2P)连接。需要使用 RTCPeerConnection 对象来管理连接。创建一个实例并配置 STUN/TURN 服务器以穿越 NAT 和防火墙。

const configuration = {
  iceServers: [
    { urls: 'stun:stun.l.google.com:19302' },
    { urls: 'turn:turn.example.com', username: 'user', credential: 'pass' }
  ]
};
const peerConnection = new RTCPeerConnection(configuration);

媒体流处理

获取本地媒体流(如摄像头和麦克风)并通过 addTrack 方法添加到连接中。

navigator.mediaDevices.getUserMedia({ video: true, audio: true })
  .then(stream => {
    stream.getTracks().forEach(track => {
      peerConnection.addTrack(track, stream);
    });
    document.getElementById('localVideo').srcObject = stream;
  });

信令交换

WebRTC 需要信令服务器交换 SDP(Session Description Protocol)和 ICE(Interactive Connectivity Establishment)候选。通过 createOffercreateAnswer 生成 SDP 并发送给远端。

peerConnection.createOffer()
  .then(offer => peerConnection.setLocalDescription(offer))
  .then(() => {
    // 发送 offer 到远端
    sendSignalingMessage({ type: 'offer', sdp: peerConnection.localDescription });
  });

peerConnection.onicecandidate = event => {
  if (event.candidate) {
    // 发送 ICE 候选到远端
    sendSignalingMessage({ type: 'ice', candidate: event.candidate });
  }
};

处理远端信号

接收远端发送的 SDP 和 ICE 候选,并通过 setRemoteDescriptionaddIceCandidate 处理。

// 处理远端 offer
peerConnection.setRemoteDescription(remoteOffer)
  .then(() => peerConnection.createAnswer())
  .then(answer => peerConnection.setLocalDescription(answer))
  .then(() => {
    // 发送 answer 到远端
    sendSignalingMessage({ type: 'answer', sdp: peerConnection.localDescription });
  });

// 处理 ICE 候选
peerConnection.addIceCandidate(new RTCIceCandidate(remoteCandidate));

显示远端流

通过 ontrack 事件捕获远端媒体流并显示。

peerConnection.ontrack = event => {
  document.getElementById('remoteVideo').srcObject = event.streams[0];
};

错误处理

监听 oniceconnectionstatechangeonnegotiationneeded 事件以处理连接状态变化和重新协商。

peerConnection.oniceconnectionstatechange = () => {
  if (peerConnection.iceConnectionState === 'failed') {
    // 处理连接失败
  }
};

完整示例

以下是一个简单的 WebRTC 视频通话实现示例:

<video id="localVideo" autoplay muted></video>
<video id="remoteVideo" autoplay></video>

<script>
  const localVideo = document.getElementById('localVideo');
  const remoteVideo = document.getElementById('remoteVideo');
  const peerConnection = new RTCPeerConnection(configuration);

  navigator.mediaDevices.getUserMedia({ video: true, audio: true })
    .then(stream => {
      localVideo.srcObject = stream;
      stream.getTracks().forEach(track => peerConnection.addTrack(track, stream));
    });

  peerConnection.ontrack = event => {
    remoteVideo.srcObject = event.streams[0];
  };

  peerConnection.onicecandidate = event => {
    if (event.candidate) {
      sendSignalingMessage({ type: 'ice', candidate: event.candidate });
    }
  };

  function startCall() {
    peerConnection.createOffer()
      .then(offer => peerConnection.setLocalDescription(offer))
      .then(() => {
        sendSignalingMessage({ type: 'offer', sdp: peerConnection.localDescription });
      });
  }

  function handleRemoteOffer(offer) {
    peerConnection.setRemoteDescription(offer)
      .then(() => peerConnection.createAnswer())
      .then(answer => peerConnection.setLocalDescription(answer))
      .then(() => {
        sendSignalingMessage({ type: 'answer', sdp: peerConnection.localDescription });
      });
  }
</script>

注意事项

  • 信令服务器需要自行实现,可以使用 WebSocket 或 HTTP 长轮询。
  • STUN 服务器用于获取公网 IP,TURN 服务器用于中继流量(在 P2P 失败时使用)。
  • 跨浏览器兼容性需测试,不同浏览器可能对编解码器支持不同。
  • 安全性方面,确保使用 HTTPS 和 WSS(WebSocket Secure)以保护通信。

webrtc js实现

标签: webrtcjs
分享给朋友:

相关文章

js实现延迟

js实现延迟

实现延迟的方法 在JavaScript中,实现延迟操作有多种方式,以下是几种常见的方法: 使用setTimeout函数 setTimeout是JavaScript中最常用的延迟执行方法。它接受一个回…

js jquery

js jquery

jQuery 简介 jQuery 是一个快速、简洁的 JavaScript 库,简化了 HTML 文档遍历、事件处理、动画设计和 Ajax 交互。它兼容多种浏览器,提供易于使用的 API,使开发者能够…

js实现变形

js实现变形

使用 CSS 和 JavaScript 实现元素变形 在 JavaScript 中实现变形效果通常结合 CSS 的 transform 属性,通过动态修改该属性实现元素的旋转、缩放、倾斜或平移。…

js树实现

js树实现

树的基本概念 树是一种非线性的数据结构,由节点和边组成。每个节点包含一个值和指向子节点的引用。树的顶部节点称为根节点,没有子节点的节点称为叶节点。 树的实现方式 在JavaScript中,树可以通…

利用js实现

利用js实现

使用 JavaScript 实现 在 JavaScript 中,可以通过多种方式实现功能,具体取决于需求。以下是几种常见的方法: 方法一:使用原生 JavaScript // 示例代码 fun…

js实现目录

js实现目录

实现目录的基本思路 在JavaScript中实现目录功能通常涉及以下几个核心步骤:解析文档中的标题元素(如h1-h6),动态生成目录结构,并添加交互逻辑(如点击跳转)。以下是具体实现方法: 解析标…