我在 aiortc repo 示例中使用了服务器文件夹作为基点。然后我做了一些修改以实现以下目标(我只对音频部分感兴趣):
浏览器最初仅发送音频,尚未添加来自远程对等点(Python 服务器)的曲目
在“停止”按钮上,数据通道用于向远程对等点(服务器)发送“已跟踪”消息
在远程对等点(服务器)上,初始化播放器,然后添加曲目
(预期)浏览器应该看到轨道事件,然后开始播放通过该轨道发送的音频(wav)
//连接音频/视频 pc.addEventListener('track', (evt) => { if (evt.track.kind == '视频') document.getElementById('video').srcObject = evt.streams[0]; 别的 document.getElementById('音频').srcObject = evt.streams[0]; });
步骤 1/2/3 效果很好。但是,第 4 步不会发生。我在这里附上了差异。我想知道这是否有限制?
注意:我不得不诉诸上述复杂的技术,因为从浏览器关闭轨道时不会调用 @track.on("end") 。
添加曲目需要新的 SDP Offer/answer 交换。所以在服务器端你需要这样做:
pc.addTrack(player.audio)
offer = await pc.createOffer()
await pc.setLocalDescription(offer)
# send the offer via datachannel or in some other way
# .....
# wait for the answer, then:
await peer_connection.setRemoteDescription(answer)
需要交换,因为对等方需要协商媒体的编解码器参数。