当前位置:首页 > JavaScript

js实现webrtc

2026-03-15 07:46:59JavaScript

WebRTC 基础概念

WebRTC(Web Real-Time Communication)是一种支持浏览器或移动应用进行实时音视频通信的开源技术。它无需插件,直接通过 JavaScript API 实现点对点(P2P)连接。

核心 API 模块

  • RTCPeerConnection:管理端到端连接,处理音视频流传输。
  • RTCDataChannel:支持端到端任意数据传递(如文本、文件)。
  • MediaStream(getUserMedia):获取摄像头、麦克风等媒体设备权限。

实现步骤

获取本地媒体流

通过 navigator.mediaDevices.getUserMedia 请求用户授权并捕获音视频流:

const constraints = { audio: true, video: true };
navigator.mediaDevices.getUserMedia(constraints)
  .then(stream => {
    const localVideo = document.getElementById('localVideo');
    localVideo.srcObject = stream;
  })
  .catch(error => console.error('Media access denied:', error));

创建 RTCPeerConnection

初始化连接对象并添加本地流:

const configuration = { iceServers: [{ urls: 'stun:stun.l.google.com:19302' }] };
const peerConnection = new RTCPeerConnection(configuration);

// 添加本地流到连接
stream.getTracks().forEach(track => {
  peerConnection.addTrack(track, stream);
});

// 监听远程流
peerConnection.ontrack = event => {
  const remoteVideo = document.getElementById('remoteVideo');
  remoteVideo.srcObject = event.streams[0];
};

处理 ICE 候选

收集网络候选地址(NAT穿透)并发送给对方:

peerConnection.onicecandidate = event => {
  if (event.candidate) {
    // 通过信令服务器发送候选(示例:使用Socket.IO)
    socket.emit('ice-candidate', event.candidate);
  }
};

// 接收对方候选
socket.on('ice-candidate', candidate => {
  peerConnection.addIceCandidate(new RTCIceCandidate(candidate));
});

信令交换

通过信令服务器交换 SDP 描述(Offer/Answer):

js实现webrtc

// 发起方创建Offer
peerConnection.createOffer()
  .then(offer => peerConnection.setLocalDescription(offer))
  .then(() => {
    socket.emit('offer', peerConnection.localDescription);
  });

// 接收方处理Offer并回复Answer
socket.on('offer', offer => {
  peerConnection.setRemoteDescription(new RTCSessionDescription(offer))
    .then(() => peerConnection.createAnswer())
    .then(answer => peerConnection.setLocalDescription(answer))
    .then(() => {
      socket.emit('answer', peerConnection.localDescription);
    });
});

// 发起方处理Answer
socket.on('answer', answer => {
  peerConnection.setRemoteDescription(new RTCSessionDescription(answer));
});

完整示例代码

<!DOCTYPE html>
<html>
<body>
  <video id="localVideo" autoplay muted></video>
  <video id="remoteVideo" autoplay></video>
  <script src="https://cdn.socket.io/4.5.0/socket.io.min.js"></script>
  <script>
    const socket = io('https://your-signaling-server.com');
    const peerConnection = new RTCPeerConnection({ 
      iceServers: [{ urls: 'stun:stun.l.google.com:19302' }] 
    });

    // 获取媒体流并设置连接
    navigator.mediaDevices.getUserMedia({ video: true, audio: true })
      .then(stream => {
        document.getElementById('localVideo').srcObject = stream;
        stream.getTracks().forEach(track => peerConnection.addTrack(track, stream));
      });

    // 信令交换逻辑(如上述代码)
  </script>
</body>
</html>

关键注意事项

  • 信令服务器:WebRTC 本身不包含信令机制,需自行实现(如 WebSocket、Socket.IO)。
  • ICE 服务器:建议配置 TURN 服务器以应对严格的 NAT 环境(如 Twilio NTS 或 Coturn)。
  • 安全性:必须使用 HTTPS 或 localhost 环境调用 getUserMedia
  • 兼容性:检查浏览器支持情况(Chrome、Firefox、Edge 较完善)。

标签: jswebrtc
分享给朋友:

相关文章

js实现列表

js实现列表

使用 JavaScript 实现列表 JavaScript 提供了多种方式来实现列表功能,包括数组操作、DOM 元素动态生成等。以下是几种常见的实现方法: 使用数组存储列表数据 数组是 JavaSc…

js实现延迟

js实现延迟

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

js实现点击显示和隐藏

js实现点击显示和隐藏

实现点击显示和隐藏的JavaScript方法 使用classList.toggle切换类名 通过添加/移除CSS类控制元素的显示与隐藏,需提前在CSS中定义隐藏样式(如display: none)。…

js实现驼峰

js实现驼峰

实现驼峰命名的几种方法 使用正则表达式和字符串替换 通过正则表达式匹配字符串中的特定模式(如下划线或短横线),并将其后的字母转换为大写,同时移除分隔符。 function toCamelCase(s…

js实现祖玛

js实现祖玛

实现祖玛游戏的核心思路 祖玛游戏的核心玩法是发射彩色珠子,形成三个或以上相同颜色的珠子即可消除。以下是使用JavaScript实现的基本框架。 游戏初始化 创建画布并初始化游戏状态: const…

js实现防洪

js实现防洪

防抖(Debounce)实现 防抖的核心思想是在事件触发后延迟执行回调函数,若在延迟时间内再次触发事件,则重新计时。适用于输入框搜索、窗口调整等场景。 function debounce(func,…