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



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

但现在我正试图在安卓手机和浏览器(本例中是我电脑中的Chrome实例(之间建立连接。

问题是,我在js中使用了一个库,它不处理通过websocket接收的候选者的消息,它只处理已经在offer/answer的sdp中的候选者,如果它们出现在另一条消息中,它们就会被丢弃(我知道,实现很差(。我希望能够在不摆脱这个库的情况下处理这个问题,现在浏览器对浏览器的工作也很好。

所以我的问题是:在android中,我一在onIceCandidate( IceCandidate iceCandidate )中得到候选人,就通过websocket发送他们。我更改了它,我不发送它们(评论该代码(,我将延迟通过websocket发送报价,直到onIceGatheringChange( PeerConnection.IceGatheringState iceGatheringState )返回COMPLETE之后。但是,即使有这样的等待,sdp描述也不包含任何关于ice候选者的信息,这与还没有候选者一样。。。还有a=ice-options:trickle renomination,我不知道是谁在设置这个选项,也不知道它是否可以更改。

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

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

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

谢谢!!

也许回复晚了,但我还是会回答的。最近也面临同样的问题。通过这种方式解决:在createLocalPeerConnection中,您需要添加一个方法:

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

使用一个条件,您可以检查候选者集合的状态,然后调用sdp-submit方法。

值:

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

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

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

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

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

new CountDownTimer(2000, 1000) {

public void onTick(long millisUntilFinished) {
}

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

这正是您需要的代码:https://github.com/x186k/whip-whap-js/blob/main/whip-whap-js.js#L40

顺序是:createOffer,setLocalDescription,等待ICE收集状态完成,抓取RTCPeerConnection的localDescription-它将包括所有ICE候选。无需再次进行createOffer/setLocalDescription

最新更新