【问题标题】:onIceCandidate is never call after setRemoteDescription - webrtc - Android在 setRemoteDescription 之后永远不会调用 onIceCandidate - webrtc - Android
【发布时间】:2020-02-14 04:43:03
【问题描述】:

我遵循一些解释如何在 webrtc 中连接的流程。但我被阻止了: 在我得到 sdpOffer 之后,我想调用 setRemoteDecrisption() 并且我有一个 onIceCandidate 的回调。但我没有这个回调。 如果您需要,我可以展示我的一段代码。

感谢您的帮助

【问题讨论】:

    标签: android webrtc


    【解决方案1】:

    首先,我对 Android 上的 WebRTC 了解不多,但我想它会与 Web API 非常相似。我在下面的流程中使用了标准 js。

    关于 onececandidate-trigger:

    onicecandidate 处理程序被调用,当您设置本地描述时see MDN onicecandidateevent。 您需要设置一个本地描述来启动冰收集过程。原因之一是,收集到的候选冰将被添加到您的本地描述中,如果您没有要添加的本地描述,它将不起作用。

    关于您的流程(也许要检查):

    至于处理 offer-answer-exchange 的过程,尝试这样做(将 A 和 B 作为 Peers,具有单独的 RTCPeerConnection-Objects pcA 和 pcB),检查您的流程是否有所不同:

    1. 首先,您应该为 A 和 B 的传入候选冰设置处理程序,例如 signaller.on('ice', candidate => pc.addIceCandidate(candidate))
    2. 然后你应该为 A 和 B 注册你的跟踪处理程序,比如 pcA.ontrack = track => ... (put it as src of your video or whatever)
    3. 将您的 MediaStreamTracks 添加到连接 pcA.addTrack(aTrack)

    (从A方开始……)

    1. A 通过调用offer = await pcA.createOffer() 生成报价
    2. A 将生成的报价设置为本地描述await pcA.setLocalDescription(offer)
    3. A 通过信令通道signaller.sendTo('B','offer', offer) 发送生成的报价,现在您的冰收集过程开始
    4. A 接收由onicecandidate-handler 生成的候选者。 pcA.onicecandidate = e => signaller.sendTo('B','ice', e.candidate)

    (现在我们跳到 B 对事物的看法)

    1. B 收到报价并将其设置为signaller.on('offer', async offer => { await pcB.setRemoteDescription(offer); // and the following steps 8 to 12 follow here })
    2. B 创建一个 sdp 答案answer = await pcB.createAnswer()
    3. B 将答案设置为本地描述await pcB.setLocalDescription(answer)
    4. 现在,B 的冰收集过程并行开始,应该像在 7 中一样处理。
    5. B 将答案发送给 A signaller.sendTo('A','answer', answer)

    (回到A)

    1. A 收到答案signaller.on('answer', async answer => await pcA.setRemoteDescription(answer); });
    2. 现在,呼叫应该已经完成​​,ice 候选交换和作为ice 状态的信令应该是stableconnected

    如果可行,请查看处理眩光,this is a good source

    【讨论】:

    • 非常感谢您的回答!事实上,我没有 onAddTrack、onTrack、onAddStream 的回调,我想我需要这个 'createAnswer' 吗?您发布的流程真的很有帮助!
    • @Softon ontrackaddTrack() 是添加 MediaStreamTrack 并对另一个站点上新添加的轨道做出反应的当前版本。您可能不需要 onAddStream(及其对应的 addStream),因为它已被弃用。当您需要 MediaStream 时,您可以从接收到的轨道构造它,例如 new MediaStream([myAlreadyReceivedAudioTrack, myAlreadyReceivedVideoTrack]);(视频和音频轨道的顺序无关紧要)
    • 我解决了我的问题!谢谢!
    • @Softon 你能帮我解决你的问题吗?因为我陷入了同样的境地,onIceCandidate 从未回电。
    • 没有。即使在调用PeerConnection.setLocalDescription 之后,也不会调用onIceCandidate
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2014-04-08
    • 2020-10-21
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2019-01-10
    相关资源
    最近更新 更多