(webrtc) setRemoteDescription 对发起者不起作用

Posted

技术标签:

【中文标题】(webrtc) setRemoteDescription 对发起者不起作用【英文标题】:(webrtc) setRemoteDescription not working for the initiator 【发布时间】:2019-11-27 14:52:42 【问题描述】:

我有一个非常简单的 html 页面,带有一个简单的 webrtc 实现和一个 socket.io 服务器。我有两个视频元素,一个是本地的,一个是远程的。用户 ID 在页面加载时随机生成。当页面加载时,它会以随机 ID 加入特定的 socket.io 房间。我还有一个呼叫按钮,可以呼叫其他用户。

当我点击调用时,我创建了一个报价,我设置了本地流,我设置了本地描述,然后将该 SDP 发送到服务器。第二个用户拿起它,将其远程描述设置为接收到的描述。然后它创建一个答案,将其本地描述设置为新描述,并设置其本地流。然后它将应答 sdp 发送到服务器。发起者获取 sdp 并设置其远程描述。

上述过程或多或少应该如何工作?为了简单起见,我忽略了眩晕和转向。

问题是,我有启动器的本地流加载,以及来宾的两个流(远程和本地!),但是远程视频没有加载到启动器的页面上。所以步骤 1、2 和 3 有效,但 4 无效。

我觉得我在这里遗漏了一些非常明显的东西......由于客人能够看到本地和远程视频,我不认为这是我的眩晕/转向设置,但也许?

有什么建议吗?这里有什么问题吗?

【问题讨论】:

这可能是由于没有 STUN 造成的。您可以尝试在本地网络中运行所有内容以排除它。或者代码中可能缺少某些东西。忘记收听远程媒体流等。不看很难说。 @AntonRusak 我确实添加了 STUN 服务器,但没有添加 TURN 服务器。我没有设置一个。但是,如果客人可以看到我的远程视频,这是否意味着不需要中继(TURN)?尽管通过隧道(ngrok),但我在同一个网络上运行它。 我注意到在我调用 setRemoteDescription 后,pc.ontrack 为来宾运行,但是当发起者调用 setRemoteDescription 时,pc.ontrack 不再被调用... 【参考方案1】:

问题解决了。我错过了一个部分。

当客人创建答案时,它会正确地将其发送给原始呼叫者。但是,guest 在生成答案之前没有将其本地轨道添加到 peerconnection 实例!

而不是这个:

                localVideo.srcObject = await navigator.mediaDevices.getUserMedia( video: true, audio: false );
                let sdp = await pc.createAnswer();
                await pc.setLocalDescription(sdp);

应该是这样的

                localVideo.srcObject = await navigator.mediaDevices.getUserMedia( video: true, audio: false );

                // this the missing piece
                for (let track of localVideo.srcObject.getTracks()) 
                    pc.addTrack(track, localVideo.srcObject);
                

                let sdp = await pc.createAnswer();
                await pc.setLocalDescription(sdp);

【讨论】:

以上是关于(webrtc) setRemoteDescription 对发起者不起作用的主要内容,如果未能解决你的问题,请参考以下文章

WebRTC介绍

WebRTC[38]- WEBRTC 与 WEBSOCKETS 的区别

WebRTC[38]- WebRTC 与 WebSocket 的区别

webrtc支持h264

webrtc源码中哪个文件有版本

WebRTC简介(一)