我正在开发一个本地的android应用程序,它使用webrtc (更确切地说是一个DataChannel )将数据发送给另一个人。它在两部android手机之间工作,在这种情况下使用ICE滴流技术。
但是现在我正试图在android手机和浏览器之间建立一个连接(在我的电脑中是一个Chrome实例,在这个例子中)。
问题是,我在js中使用一个库,它不处理通过websocket接收到的候选人的消息,它只处理已经在sdp中的候选人,如果他们收到了另一条消息,他们就会被丢弃(我知道,很糟糕的实现)。我希望能够在不摆脱这个库的情况下处理这个问题,而现在浏览器对浏览器来说工作得很好。
因此,我的问题是:在安卓系统中,一旦我在onIceCandidate( IceCandidate iceCandidate )
上得到了候选人,我就会通过websocket发送他们。我更改了它,我不会发送它们(注释代码),而且我会推迟通过websocket发送服务,只在onIceGatheringChange( PeerConnection.IceGatheringState iceGatheringState )
返回COMPLETE
之后才发送。但是即使在等待的情况下,sdp的描述也不包含任何关于冰候选的内容,就像没有候选人可用一样.还有a=ice-options:trickle renomination
,我不知道是谁在设置这个选项,也不知道它是否可以更改。
sdp描述应该是在创建后更改吗?我发现,无论什么情况,onCreateSuccess( SessionDescription sdp )
中的设置都是一样的。
我还尝试了另一种方法,将iceCandidatePoolSize
设置为1
,以便在创建招聘机会之前获得候选人,但它没有改变任何事情。
我是不是遗漏了什么?sdp真的只有等待候选人才能改变吗?还是我需要以某种方式阻止涓涓细流?我没能找到这个信息。
谢谢你!!
发布于 2022-01-15 21:57:25
也许迟了回复,但我还是会回答的。最近也面临同样的问题。以这种方式解决了这个问题:在createLocalPeerConnection中,需要添加一个方法:
@Override
public void onIceGatheringChange(PeerConnection.IceGatheringState iceGatheringState) {
super.onIceGatheringChange(iceGatheringState);
if(iceGatheringState == PeerConnection.IceGatheringState.COMPLETE) {
createLoclOffer(sdpConstraints);
}
}
在有条件的情况下,检查候选人集合的状态,然后调用sdp提交方法。
值:
新对等连接刚刚创建,还没有进行任何网络连接。
ICE代理正在收集连接的候选人。
完成洲际交易所代理已经完成收集候选人。如果发生需要收集新候选人的事件,例如添加新的界面或添加新的ICE服务器,则状态将恢复为收集这些候选人。
请注意,为了收集冰候选,需要一个已经形成的sdp。
我找到了另一个解决问题的方法。如果你等待完整状态的收集冰候选,那么它需要很长的时间。因此,您可以设置一个时间计数器(2秒就足够了),在时间过去之后,使用建议调用该方法。
new CountDownTimer(2000, 1000) {
public void onTick(long millisUntilFinished) {
}
public void onFinish() {
createLoclOffer(sdpConstraints);
}
}
.start();
https://stackoverflow.com/questions/70521688
复制相似问题