WebRTC 实时通信:构建音视频通话应用

WebRTC 实时通信:构建音视频通话应用

什么是 WebRTC?

WebRTC(Web Real-Time Communication)是一个支持浏览器之间实时通信的 API。

WebRTC 的组成

API 功能
MediaStream 访问摄像头和麦克风
RTCPeerConnection 建立点对点连接
RTCDataChannel 数据通道

获取媒体流

javascript 复制代码
async function getMediaStream() {
  try {
    const stream = await navigator.mediaDevices.getUserMedia({
      video: true,
      audio: true
    });
    return stream;
  } catch (error) {
    console.error('获取媒体流失败:', error);
  }
}

显示视频流

html 复制代码
<video id="localVideo" autoplay playsinline></video>
javascript 复制代码
const video = document.getElementById('localVideo');
const stream = await getMediaStream();
video.srcObject = stream;

建立点对点连接

javascript 复制代码
const peerConnection = new RTCPeerConnection({
  iceServers: [
    { urls: 'stun:stun.l.google.com:19302' }
  ]
});

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

// 创建 Offer
const offer = await peerConnection.createOffer();
await peerConnection.setLocalDescription(offer);

// 发送 Offer 到信令服务器
sendToServer({ type: 'offer', data: offer });

信令服务器

javascript 复制代码
// 简易信令服务器
const WebSocket = require('ws');
const wss = new WebSocket.Server({ port: 8080 });

wss.on('connection', (ws) => {
  ws.on('message', (data) => {
    wss.clients.forEach((client) => {
      if (client !== ws && client.readyState === WebSocket.OPEN) {
        client.send(data);
      }
    });
  });
});

处理远程流

javascript 复制代码
peerConnection.ontrack = (event) => {
  const remoteVideo = document.getElementById('remoteVideo');
  remoteVideo.srcObject = event.streams[0];
};

// 接收 Answer
peerConnection.setRemoteDescription(answer);

数据通道

javascript 复制代码
const dataChannel = peerConnection.createDataChannel('chat');

dataChannel.onopen = () => {
  dataChannel.send('Hello from WebRTC!');
};

dataChannel.onmessage = (event) => {
  console.log('收到消息:', event.data);
};

STUN 和 TURN 服务器

javascript 复制代码
const configuration = {
  iceServers: [
    { urls: 'stun:stun.l.google.com:19302' },
    {
      urls: 'turn:turn.example.com:3478',
      username: 'user',
      credential: 'password'
    }
  ]
};

错误处理

javascript 复制代码
peerConnection.oniceconnectionstatechange = () => {
  if (peerConnection.iceConnectionState === 'failed') {
    console.error('连接失败,尝试重新连接');
  }
};

peerConnection.onicegatheringstatechange = () => {
  if (peerConnection.iceGatheringState === 'complete') {
    console.log('ICE 候选收集完成');
  }
};

实战案例

视频通话应用

javascript 复制代码
class VideoCall {
  constructor() {
    this.peerConnection = null;
    this.localStream = null;
  }
  
  async start() {
    this.localStream = await navigator.mediaDevices.getUserMedia({
      video: true,
      audio: true
    });
    
    this.setupPeerConnection();
    this.connectToSignaling();
  }
  
  setupPeerConnection() {
    this.peerConnection = new RTCPeerConnection({
      iceServers: [{ urls: 'stun:stun.l.google.com:19302' }]
    });
    
    this.localStream.getTracks().forEach(track => {
      this.peerConnection.addTrack(track, this.localStream);
    });
  }
}

总结

WebRTC 为实时通信提供了强大的能力:

  1. 浏览器原生支持:无需插件
  2. 低延迟:直接点对点连接
  3. 数据通道:支持文本和二进制数据
  4. 跨平台:支持桌面和移动浏览器

掌握 WebRTC,构建实时音视频应用。

相关推荐
安逸sgr21 分钟前
《图解机器学习-第四章》:损失函数和梯度下降:模型是怎么被训练出来的?
人工智能·机器学习·图解机器学习
进击的横打21 分钟前
【人工智能】AI的三层金字塔逻辑
人工智能
oyyanghh34 分钟前
AI编码模式实测:两款主流工具交互式开发能力对比
人工智能
代码小库41 分钟前
【2026前端转 AI 全栈指南】第 1 章:前言 · 后端架构 · 章节导览
前端·人工智能·架构
极光代码工作室42 分钟前
基于深度学习的手写数字识别系统
人工智能·python·深度学习·神经网络·机器学习
笨蛋©43 分钟前
2026年制造业MSA测量系统分析(Measurement System Analysis)标准化…
ai·数字化·质量管理·制造业·图纸识别
Tbisnic1 小时前
AI大模型学习第十三天:让AI学会查资料、记数据、看图和听声
人工智能·ai·大模型开发·rag·coze
blue_dou1 小时前
灵活拓展能力对决:多款CRM自定义与数据互通实测
大数据·人工智能
女神下凡1 小时前
这是 Cursor(Composer) 的五种核心交互模式
服务器·人工智能·windows·vscode·microsoft
AI创界者1 小时前
告别云端限制!Sulphur 2 本地文生视频/图生视频整合包,本地部署,解压即用,保姆级部署与工作流实战
人工智能·python·aigc·音视频