【发布时间】:2020-02-14 04:43:03
【问题描述】:
我遵循一些解释如何在 webrtc 中连接的流程。但我被阻止了: 在我得到 sdpOffer 之后,我想调用 setRemoteDecrisption() 并且我有一个 onIceCandidate 的回调。但我没有这个回调。 如果您需要,我可以展示我的一段代码。
感谢您的帮助
【问题讨论】:
我遵循一些解释如何在 webrtc 中连接的流程。但我被阻止了: 在我得到 sdpOffer 之后,我想调用 setRemoteDecrisption() 并且我有一个 onIceCandidate 的回调。但我没有这个回调。 如果您需要,我可以展示我的一段代码。
感谢您的帮助
【问题讨论】:
首先,我对 Android 上的 WebRTC 了解不多,但我想它会与 Web API 非常相似。我在下面的流程中使用了标准 js。
onicecandidate 处理程序被调用,当您设置本地描述时,see MDN onicecandidateevent。 您需要设置一个本地描述来启动冰收集过程。原因之一是,收集到的候选冰将被添加到您的本地描述中,如果您没有要添加的本地描述,它将不起作用。
至于处理 offer-answer-exchange 的过程,尝试这样做(将 A 和 B 作为 Peers,具有单独的 RTCPeerConnection-Objects pcA 和 pcB),检查您的流程是否有所不同:
signaller.on('ice', candidate => pc.addIceCandidate(candidate))
pcA.ontrack = track => ... (put it as src of your video or whatever) pcA.addTrack(aTrack)
(从A方开始……)
offer = await pcA.createOffer() 生成报价
await pcA.setLocalDescription(offer)
signaller.sendTo('B','offer', offer) 发送生成的报价,现在您的冰收集过程开始onicecandidate-handler 生成的候选者。 pcA.onicecandidate = e => signaller.sendTo('B','ice', e.candidate)
(现在我们跳到 B 对事物的看法)
signaller.on('offer', async offer => { await pcB.setRemoteDescription(offer); // and the following steps 8 to 12 follow here })
answer = await pcB.createAnswer()
await pcB.setLocalDescription(answer)
signaller.sendTo('A','answer', answer)
(回到A)
signaller.on('answer', async answer => await pcA.setRemoteDescription(answer); });
stable 或connected
如果可行,请查看处理眩光,this is a good source。
【讨论】:
ontrack 和 addTrack() 是添加 MediaStreamTrack 并对另一个站点上新添加的轨道做出反应的当前版本。您可能不需要 onAddStream(及其对应的 addStream),因为它已被弃用。当您需要 MediaStream 时,您可以从接收到的轨道构造它,例如 new MediaStream([myAlreadyReceivedAudioTrack, myAlreadyReceivedVideoTrack]);(视频和音频轨道的顺序无关紧要)
onIceCandidate 从未回电。
PeerConnection.setLocalDescription 之后,也不会调用onIceCandidate