【问题标题】:How to get ICE candidates to be added in sdp description如何在 sdp 描述中添加 ICE 候选人
【发布时间】:2022-01-20 11:25:27
【问题描述】:

我正在开发一个原生 android 应用程序,它使用 webrtc,更具体地说是 DataChannel,将数据发送给另一个人。它在两部安卓手机之间工作,在这种情况下使用 ICE 滴流。

但现在我正在尝试在 Android 手机和浏览器(在本例中为我计算机中的 Chrome 实例)之间建立连接。

问题是我在 js 中使用了一个库,它不处理通过 websocket 接收到的候选人的消息,它只适用于 offer/answer 的 sdp 中已经存在的候选人,如果它们出现在另一条消息中,它们将被丢弃(我知道执行不力)。我希望能够在不摆脱这个库的情况下处理这个问题,现在浏览器到浏览器它工作得很好。

所以这是我的问题:在 android 中,当我在onIceCandidate( IceCandidate iceCandidate ) 中获得候选人后,我就通过 websocket 发送候选人。我更改了它,我没有发送它们(注释了该代码)并且我延迟通过 websocket 发送报价,仅在onIceGatheringChange( PeerConnection.IceGatheringState iceGatheringState ) 返回COMPLETE 之后发生。但即使有这样的等待,sdp 描述不包含任何有关冰候选人的内容,这与还没有候选人完全一样......还有a=ice-options:trickle renomination,我没有'不知道是谁在设置此选项或是否可以更改。

sdp 描述在创建后是否应该更改?我发现不管onCreateSuccess( SessionDescription sdp )中设置了什么,它都保持不变。

我还尝试了另一件事,将 iceCandidatePoolSize 设置为 1 以便在创建报价之前获得候选人,但这并没有改变任何事情。

我错过了什么吗? sdp真的只有等待候选人才能改变吗?还是我需要以某种方式禁用涓流?我找不到此信息。

谢谢!!

【问题讨论】:

    标签: android webrtc


    【解决方案1】:

    也许回复晚了,但我还是会回复的。最近遇到了同样的问题。是这样解决的: 在createLocalPeerConnection中,需要添加一个方法:

      @Override
            public void onIceGatheringChange(PeerConnection.IceGatheringState iceGatheringState) {
                super.onIceGatheringChange(iceGatheringState);
                if(iceGatheringState == PeerConnection.IceGatheringState.COMPLETE) {
                    createLoclOffer(sdpConstraints);
                }
            }
    

    通过一个条件,你检查候选集合的状态,然后调用sdp提交方法。

    价值:

    对等连接刚刚创建,尚未建立任何网络。

    聚会 ICE 代理正在为连接收集候选人。

    完成 ICE 特工已经完成了候选人的收集。如果发生需要收集新候选人的事情,例如添加新界面或添加新 ICE 服务器,状态将恢复为收集这些候选人。

    请注意,为了收集候选冰,需要一个已经形成的 sdp。

    我找到了另一种解决问题的方法。如果等待ice候选集合的COMPLETE状态,那么需要很长时间。为此,您可以设置一个时间计数器(2 秒就足够了),在时间过去后,调用该方法并提出建议。

     new CountDownTimer(2000, 1000) {
    
            
            public void onTick(long millisUntilFinished) {
    
            }
            
            public void onFinish() {
                createLoclOffer(sdpConstraints);
            }
        }
                .start();
    

    【讨论】:

    • 感谢您的回答!但是在创建报价 (peerConnection.createOffer()) 之前,您是如何收集这些候选人的? “需要已经形成的 sdp”是什么意思?在创建报价之前,我无法获得候选人。
    • 就是这样!在创建报价之前,您无法接收候选人。因此,在收集候选冰之前创建一个提案。之后,收集候选人并再次调用发出报价的方法。
    • 这个选项当然不漂亮,但我现在能想到的就这些了。)
    猜你喜欢
    • 2014-01-03
    • 1970-01-01
    • 1970-01-01
    • 2016-08-08
    • 2015-12-17
    • 1970-01-01
    • 2017-06-17
    • 2019-05-21
    • 1970-01-01
    相关资源
    最近更新 更多