我正在使用WebRTC构建一个视频呼叫应用程序,该应用程序允许一个对等方通过在大厅中选择某人来呼叫另一个对等体。当对等体A发送呼叫请求时,另一个对等体B可以接受。此时,WebRTC信号启动:
- 两个对等端都使用MediaDevices.getUserMedia((获取本地媒体
- 两个对等端都创建RTCPeerConnection并附加事件侦听器
- 两个对等方都调用RTCPeerConnection.addTrack((来添加其本地媒体
- 一个对等体A(不礼貌的用户(创建了一个offer,调用RTCPeerConnection.setLocalDescription((将该offer设置为本地描述,并将其发送到WebSocket服务器,后者将其转发给另一个对等方B
- 另一个对等端B接收此提供并添加调用RTCPeerConnection.setRemoteDescription((以将其记录为远程描述
- 另一个对等体B然后创建一个应答并将其再次发送给第一个对等体A
(步骤基于https://developer.mozilla.org/en-US/docs/Web/API/WebRTC_API/Connectivity)
这个流程几乎运行良好。在10个电话中,有1个没有收到其中一个对等方的视频/音频(而两个对等方都有本地视频(。在这种情况下,我注意到答案SDP包含a=recvonly
,而在正常情况下应该是a=sendrecv
。我进一步确定,当另一方收到报价并需要回复时,这一方的localMedia有时还没有添加,因为MediaDevices.getUserMedia可能需要一段时间才能完成。我还通过记录和观察到报价有时在添加本地轨道之前到达,确认了这一操作顺序。
我想我不应该在添加本地媒体之前发送答案?
我正在考虑两种方法来解决这个问题,但我不确定哪种选择是最好的,如果有的话:
- 只有在MediaDevices.getUserMedia((完成后才能创建RTCPeerConnection。与此同时,当接收到要约时,还没有对等连接,因此我们将要约保存在缓冲区中,以便在创建RTCPeerConnection后进行处理
- 当收到报价,并且还没有localMedia曲目时,请推迟创建答案,直到添加了localMedia曲目
我很难决定哪种解决方案(或另一种(与";完美谈判"图案
提前感谢!
是的,如果是"静态"添加流,那么在创建offer之前添加流是很好的,但最好的方法是在onnegotiationneeded事件中添加,因为addtrack事件会触发onnegotiattionneeded事件。因此,您应该添加流,然后在onnegotiationneed中使用createoffer。就答案而言,您可以在没有问题的情况下完成之前的操作,但请记住,一个完善的连接将允许您添加/删除没有问题的曲目(即使在设置了SDP之后(。你没有发布任何代码,但请记住,你也必须交换ice候选人。最后一条建议,请记住,以上所有内容都是异步的!因此,您应该使用promise,并等待,直到设置了描述,然后再创建一个offer/answer。希望这将有助于