我应该在添加我方的本地媒体曲目之前发送 WebRTC 应答吗?
Should I send a WebRTC answer before my side's localMedia tracks were added?
我正在使用 WebRTC 构建一个视频通话应用程序,它允许一个点通过在大厅中选择某人来呼叫另一个点。当peer A 发出呼叫请求时,另一个peer B 可以接受。此时,WebRTC信令开始:
- 双方都使用 MediaDevices.getUserMedia()
获取本地媒体
- 两个对等点都创建一个 RTCPeerConnection 并附加事件侦听器
- 双方都调用 RTCPeerConnection.addTrack() 添加他们的本地媒体
- 一个节点 A(不礼貌的用户)创建一个报价,调用 RTCPeerConnection.setLocalDescription() 将该报价设置为本地描述,并将其发送到 WebSocket 服务器,该服务器将其转发给另一个节点 B .
- 另一个节点 B 收到此报价并添加调用 RTCPeerConnection.setRemoteDescription() 以将其记录为远程描述
- 另一个节点 B 然后创建一个答案并将其再次传输给第一个节点 A。
(步骤基于https://developer.mozilla.org/en-US/docs/Web/API/WebRTC_API/Connectivity)
这个流程几乎运行良好。在十分之一的呼叫中,我没有收到来自其中一个对等方的 video/audio(而两个对等方都有工作的本地视频)。在这种情况下,我注意到答案 SDP 包含 a=recvonly
,而在正常情况下这应该是 a=sendrecv
。
我进一步确定,当另一个同行收到报价并需要回复答案时,这边的 localMedia 有时还没有添加,因为 MediaDevices.getUserMedia 可能需要一段时间才能完成。我还通过记录和观察报价有时在添加本地曲目之前到达来确认此操作顺序。
我假设我不应该在添加本地媒体之前发送答复?
我正在考虑两种方法来解决这个问题,但我不确定哪个选项最好(如果有的话):
- 仅在 MediaDevices.getUserMedia() 完成后创建 RTCPeerConnection。与此同时,当收到一个报价时,还没有对等连接,所以我们将报价保存在缓冲区中,以便在创建 RTCPeerConnection 后处理它们。
- 收到报价但还没有 localMedia 曲目时,在添加 localMedia 曲目之前不要创建答案。
我很难决定哪个(或另一个)解决方案最符合“完美协商”模式。
提前致谢!
是的,如果您这样做,最好在创建报价之前添加流 'statically',但最好的方法是在 onnegotiationneeded 事件中添加流,因为 addtrack 事件会触发 onnegotiationneeded事件。因此,您应该添加流,然后在 onnegotiationneeded 中使用 createoffer。至于答案,您之前可以毫无问题地做到这一点,但请记住,建立良好的连接将使您 add/remove 跟踪没有问题(即使在设置 SDP 之后)。您没有 post 任何代码,但请记住,您还必须交换 ice 候选人。
最后一条建议,记住以上所有都是异步的!所以你应该使用 promises,并等待直到描述被设置,然后才创建一个 offer/answer。
希望这会有所帮助
我正在使用 WebRTC 构建一个视频通话应用程序,它允许一个点通过在大厅中选择某人来呼叫另一个点。当peer A 发出呼叫请求时,另一个peer B 可以接受。此时,WebRTC信令开始:
- 双方都使用 MediaDevices.getUserMedia() 获取本地媒体
- 两个对等点都创建一个 RTCPeerConnection 并附加事件侦听器
- 双方都调用 RTCPeerConnection.addTrack() 添加他们的本地媒体
- 一个节点 A(不礼貌的用户)创建一个报价,调用 RTCPeerConnection.setLocalDescription() 将该报价设置为本地描述,并将其发送到 WebSocket 服务器,该服务器将其转发给另一个节点 B .
- 另一个节点 B 收到此报价并添加调用 RTCPeerConnection.setRemoteDescription() 以将其记录为远程描述
- 另一个节点 B 然后创建一个答案并将其再次传输给第一个节点 A。
(步骤基于https://developer.mozilla.org/en-US/docs/Web/API/WebRTC_API/Connectivity)
这个流程几乎运行良好。在十分之一的呼叫中,我没有收到来自其中一个对等方的 video/audio(而两个对等方都有工作的本地视频)。在这种情况下,我注意到答案 SDP 包含 a=recvonly
,而在正常情况下这应该是 a=sendrecv
。
我进一步确定,当另一个同行收到报价并需要回复答案时,这边的 localMedia 有时还没有添加,因为 MediaDevices.getUserMedia 可能需要一段时间才能完成。我还通过记录和观察报价有时在添加本地曲目之前到达来确认此操作顺序。
我假设我不应该在添加本地媒体之前发送答复?
我正在考虑两种方法来解决这个问题,但我不确定哪个选项最好(如果有的话):
- 仅在 MediaDevices.getUserMedia() 完成后创建 RTCPeerConnection。与此同时,当收到一个报价时,还没有对等连接,所以我们将报价保存在缓冲区中,以便在创建 RTCPeerConnection 后处理它们。
- 收到报价但还没有 localMedia 曲目时,在添加 localMedia 曲目之前不要创建答案。
我很难决定哪个(或另一个)解决方案最符合“完美协商”模式。
提前致谢!
是的,如果您这样做,最好在创建报价之前添加流 'statically',但最好的方法是在 onnegotiationneeded 事件中添加流,因为 addtrack 事件会触发 onnegotiationneeded事件。因此,您应该添加流,然后在 onnegotiationneeded 中使用 createoffer。至于答案,您之前可以毫无问题地做到这一点,但请记住,建立良好的连接将使您 add/remove 跟踪没有问题(即使在设置 SDP 之后)。您没有 post 任何代码,但请记住,您还必须交换 ice 候选人。 最后一条建议,记住以上所有都是异步的!所以你应该使用 promises,并等待直到描述被设置,然后才创建一个 offer/answer。 希望这会有所帮助