寻求仅基于WebRTC实现音频通话的代码示例及免费服务支持
WebRTC 纯音频通话代码示例与免费服务选项
纯音频通话核心代码示例
下面是一个极简的纯音频通话前端实现,完全剔除视频相关逻辑,专注音频流处理:
初始化本地音频与PeerConnection
// 获取本地音频流 async function getLocalAudioStream() { try { const stream = await navigator.mediaDevices.getUserMedia({ audio: true, video: false // 明确禁用视频模块 }); // 绑定本地音频到页面元素(可选,用于监听自身声音) const localAudio = document.getElementById('local-audio'); localAudio.srcObject = stream; return stream; } catch (err) { console.error('音频流获取失败:', err); } } // 创建仅处理音频的PeerConnection实例 function createPeerConnection(isInitiator, localStream) { const pc = new RTCPeerConnection({ iceServers: [ { urls: 'stun:stun.l.google.com:19302' } // 免费公共STUN服务器 ] }); // 将本地音频轨道添加到连接 localStream.getAudioTracks().forEach(track => { pc.addTrack(track, localStream); }); // 监听并播放远程音频流 pc.ontrack = (event) => { const remoteAudio = document.getElementById('remote-audio'); remoteAudio.srcObject = event.streams[0]; }; // ICE候选处理(模拟信令传输,实际需通过服务器转发) pc.onicecandidate = (event) => { if (event.candidate) { console.log('待发送ICE候选:', JSON.stringify(event.candidate)); } }; // 发起方创建通话Offer if (isInitiator) { pc.createOffer().then(offer => { return pc.setLocalDescription(offer); }).then(() => { console.log('待发送Offer:', JSON.stringify(pc.localDescription)); }); } return pc; } // 接收方处理收到的Offer async function handleOffer(pc, offerData) { await pc.setRemoteDescription(new RTCSessionDescription(offerData)); const answer = await pc.createAnswer(); await pc.setLocalDescription(answer); console.log('待发送Answer:', JSON.stringify(pc.localDescription)); } // 发起方处理收到的Answer async function handleAnswer(pc, answerData) { await pc.setRemoteDescription(new RTCSessionDescription(answerData)); } // 处理对方发送的ICE候选 async function handleIceCandidate(pc, candidateData) { await pc.addIceCandidate(new RTCIceCandidate(candidateData)); }
配套基础HTML结构
<audio id="local-audio" autoplay muted></audio> <audio id="remote-audio" autoplay></audio> <button onclick="initCall(true)">发起通话</button> <button onclick="initCall(false)">接听通话</button> <script> let localStream; let pc; async function initCall(isInitiator) { localStream = await getLocalAudioStream(); pc = createPeerConnection(isInitiator, localStream); } // 放入上方JavaScript代码 </script>
说明:示例中信令传输用控制台输出模拟,实际测试时需搭建简单信令服务(比如Node.js+WebSocket),用于传递Offer、Answer和ICE候选数据。
免费WebRTC音频通话服务提供商
- Google STUN服务器:免费公共STUN服务,无需注册,直接用于获取网络地址,适合基础连通性测试。
- Twilio免费额度:提供免费WebRTC服务额度,支持纯音频通话,小流量测试完全够用,可用于探索扩展性。
- Agora免费套餐:包含免费通话分钟数,支持纯音频场景,配置简单,快速搭建测试环境。
- Daily免费版:提供免费房间通话服务,支持多人音频通话,免费版有并发限制但满足初期探索需求。
内容的提问来源于stack exchange,提问作者Jood Alk
相关产品推荐
相关产品推荐

