使用addTransceiver后,如何从localPeer与RemotePeer获取音频?
问题详情
我的尝试
我已根据自身理解、查阅的资料以及他人的同类问题解决思路,尽可能实现相关步骤,并参照他人写法编写代码。
预期目标
希望一切运行正常,同时积累更多WebRTC相关知识用于后续项目。
已执行步骤
- 在localPeer上调用
addTransceiver - 在RemotePeer上调用
getTransceiver
我的连接代码
yourConn = new RTCPeerConnection(servers); yourConn2 = new RTCPeerConnection(servers);
当前困境
在执行以下代码并将RemotePeer的方向设置为sendrecv后,我陷入了停滞:
yourConn.addTransceiver(streams.getAudioTracks()[0]);
请问在此之后,我该如何从RemotePeer获取音频?
解决方案
要从RemotePeer(即yourConn2)获取音频,按以下步骤操作即可:
- 交换ICE候选,打通网络连接
两个PeerConnection需要交换ICE候选才能建立实际的网络通路,添加这段代码:
// localPeer发现ICE候选后,传给remotePeer yourConn.onicecandidate = (e) => { if (e.candidate) { yourConn2.addIceCandidate(e.candidate); } }; // remotePeer同理,把自己的候选传给localPeer yourConn2.onicecandidate = (e) => { if (e.candidate) { yourConn.addIceCandidate(e.candidate); } };
- 完成SDP会话协商
添加收发器后,需要生成并交换会话描述(SDP)来确认音视频参数:
// localPeer生成offer并设置 yourConn.createOffer() .then(offer => yourConn.setLocalDescription(offer)) .then(() => { // 把offer传给remotePeer并设置为远端描述 yourConn2.setRemoteDescription(yourConn.localDescription); // remotePeer生成answer return yourConn2.createAnswer(); }) .then(answer => yourConn2.setLocalDescription(answer)) .then(() => { // 把answer传回localPeer设置为远端描述 yourConn.setRemoteDescription(yourConn2.localDescription); }) .catch(err => console.error('会话协商出错:', err));
- 在RemotePeer上监听并播放音频
当RemotePeer接收到音频轨道时,会触发track事件,通过这个事件获取音频并播放:
yourConn2.ontrack = (e) => { // 创建音频元素并自动播放 const audioElement = document.createElement('audio'); audioElement.srcObject = e.streams[0]; audioElement.autoplay = true; document.body.appendChild(audioElement); };
- 确认收发器方向设置
如果之前设置RemotePeer的收发器方向为sendrecv,可以在会话协商完成后再次确认:
yourConn2.getTransceivers().forEach(transceiver => { transceiver.direction = 'sendrecv'; });
内容的提问来源于stack exchange,提问作者Adam
相关产品推荐
相关产品推荐

