我正在开发一个 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/