android - 如何将 ICE 候选人添加到 sdp 描述中

标签 android webrtc

我正在开发一个 native Android 应用程序,它使用 webrtc(更具体地说是 DataChannel)将数据发送给另一个人。它在两部 Android 手机之间运行,在本例中使用 ICE 滴流。

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

问题是,我在 js 中使用的库不处理通过 websocket 收到的候选者的消息,它只处理 offer/answer 的 sdp 中已经存在的候选者,如果它们出现在另一条消息中,它们将被丢弃(我知道,实现很差)。我希望能够在不删除这个库的情况下处理这个问题,而且现在浏览器到浏览器都工作得很好。

所以这是我的问题:在 android 中,一旦我在 onIceCandidate( IceCandidateiceCandidate ) 中收到候选人,我就会通过 websocket 发送候选人。我更改了它,我没有发送它们(注释了该代码),并且我延迟了仅在 onIceGatheringChange( PeerConnection.IceGatheringStateiceGatheringState ) 返回之后才通过 websocket 发送报价 完成。但即使这样等待,sdp 描述也不包含有关ice-candidates 的任何内容,这就像还没有可用的候选者一样......并且有a=ice-options :trickle renomination,我不知道是谁设置了这个选项,也不知道它是否可以更改。

sdp 描述在创建后是否应该更改?我发现无论如何,在 onCreateSuccess( SessionDescription sdp ) 中设置的内容都保持不变。

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

我错过了什么吗?难道社会民主党真的只有等待候选人才能改变吗?或者我是否需要以某种方式禁用涓流?我无法找到此信息。

谢谢!!

最佳答案

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

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

通过条件,您可以检查候选人集合的状态,然后调用 sdp 提交方法。

值:

对等连接刚刚创建,尚未进行任何联网。

聚集 ICE 代理正在收集连接候选者。

完成 ICE 特工已完成候选人收集。如果发生需要收集新候选者的情况,例如添加新接口(interface)或添加新 ICE 服务器,状态将恢复为收集这些候选者。

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

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

 new CountDownTimer(2000, 1000) {

        
        public void onTick(long millisUntilFinished) {

        }
        
        public void onFinish() {
            createLoclOffer(sdpConstraints);
        }
    }
            .start();

关于android - 如何将 ICE 候选人添加到 sdp 描述中,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/70521688/

相关文章:

android - 在 SnapChat 等 Activity 之间滑动?

android - Phonegap,发布版本中的 Android getJSON 调用

从 Android 中的 URL 获取 HTML 源代码的 Java 代码不起作用

webrtc - TURN 服务器如何将数据发送到 NAT 后面的对等点?

javascript - XMLHttpRequest 跨源请求仅支持协议(protocol)方案依次服务器

android - UIL 安卓 "cache is closed"

android - scrollView 内的 fragment

javascript - 如何实现 WebRTC 录制到 Node.js 服务器

network-programming - 检查 WebRTC 连接 - 可靠的方法

javascript - 如何使用 RTCPeerConnection.removeTrack() 删除视频或音频或两者?