js实现webrtc
WebRTC 基础概念
WebRTC(Web Real-Time Communication)是一种支持浏览器或移动应用进行实时音视频通信的开源技术。它无需插件,直接通过 JavaScript API 实现点对点(P2P)连接。
核心 API 组件
- RTCPeerConnection:管理端到端连接,处理音视频流传输。
- RTCDataChannel:支持端到端任意数据交换。
- MediaDevices.getUserMedia():获取本地摄像头和麦克风权限。
实现基本视频通话步骤
获取本地媒体流
navigator.mediaDevices.getUserMedia({ video: true, audio: true })
.then(stream => {
localVideo.srcObject = stream;
localStream = stream;
});
创建对等连接
const pc = new RTCPeerConnection(configuration);
pc.addStream(localStream);
pc.onicecandidate = handleICECandidate;
pc.onaddstream = handleRemoteStream;
交换信令信息
// 生成 offer
pc.createOffer()
.then(offer => pc.setLocalDescription(offer))
.then(() => sendOfferToPeer(pc.localDescription));
// 接收 answer
function receiveAnswer(answer) {
pc.setRemoteDescription(new RTCSessionDescription(answer));
}
处理 ICE 候选

function handleICECandidate(event) {
if (event.candidate) {
sendCandidateToPeer(event.candidate);
}
}
function receiveCandidate(candidate) {
pc.addIceCandidate(new RTCIceCandidate(candidate));
}
完整示例代码
<script>
let localStream, pc;
async function startCall() {
localStream = await navigator.mediaDevices.getUserMedia({video: true, audio: true});
document.getElementById('localVideo').srcObject = localStream;
pc = new RTCPeerConnection();
pc.addStream(localStream);
pc.onicecandidate = e => {
if (e.candidate) {
// 发送候选到对等端
}
};
pc.onaddstream = e => {
document.getElementById('remoteVideo').srcObject = e.stream;
};
const offer = await pc.createOffer();
await pc.setLocalDescription(offer);
// 发送 offer 到对等端
}
</script>
注意事项
- 需要信令服务器交换 SDP 和 ICE 候选信息
- STUN/TURN 服务器用于 NAT 穿透
- 现代浏览器需要 HTTPS 环境才能使用媒体设备
- 错误处理应包含权限拒绝、网络问题等场景
高级功能扩展
- 使用 RTCDataChannel 进行文件传输
- 实现屏幕共享功能
- 添加多方通话支持
- 集成 WebSocket 作为信令通道
以上实现展示了 WebRTC 的核心流程,实际应用中需根据具体场景完善信令交换和错误处理机制。






