我想用RTCPeerConnections连接两个对等体,但是我无法将Alice的IceCandidate添加到Bob。
示例:
var alice = new RtcPeerConnection(
{"iceServers": [{"url": "stun:stun.l.google.com:19302"}]}
);
var bob = new RtcPeerConnection(
{"iceServers": [{"url": "stun:stun.l.google.com:19302"}]}
);
alice.createDataChannel("somelablel", {});
alice.onNegotiationNeeded.listen((var data){
alice.createOffer({}).then((var offer){
//got offer
alice.setLocalDescription(offer);
bob.setRemoteDescription(offer);
});
});
bob.onIceCandidate.listen((evt) {
if (evt.candidate)
print(evt.cancelable);
});
alice.onIceCandidate.listen((evt) {
if(evt.candidate != null)
//TODO: add iceCandidate to Bob
});
第一个版本(似乎很旧但在在线示例中大量使用):
bob.addIceCandidate(candidatefromAlice);
输出:
Class 'RtcPeerConnection' has no instance method
'addIceCandidate' with matching arguments.
第二次尝试(包含3个参数的新版本):
bob.addIceCandidate(candidatefromAlice, (){}, (var error){
print(error.toString());
});
输出:
NotSupportedError: The implementation did not support the
requested type of object or operation. (Dartium)
如何设置飞镖中的ICE候选人没有问题?
的信息:
Dart VM版本:0.1.2.0_r30864(2013年12月4日星期三11:03:45)“linux_x64”上 dartium:Chromium 31.0.1650.48
答案 0 :(得分:1)
我认为您必须等到修复此错误 https://code.google.com/p/dart/issues/detail?id=15008
您要求的代码似乎是
bob.addIceCandidate(evt.candidate, () => print('void: $evt'), (var x) => print('FailureCallback: $evt'));
对此问题的评论Is addIceCandidate implemented in Dartium?似乎表明它在Dartium中不起作用,但在将项目转换为JavaScript后可在Chrome中使用。
答案 1 :(得分:0)
我通过使用js-interop库找到了解决方法。只需使用代理:
import 'package:js/js.dart' as js;
// ...
_rpc = new js.Proxy(js.context.webkitRTCPeerConnection, js.map(iceServers));
// ...
var iceCandidate = new js.Proxy(js.context.RTCIceCandidate,
js.context.JSON.parse(/*your icecandidate string*/)
);
_rpc.addIceCandidate(iceCandidate);