WebRTC 数据通道未连接或未调用回调
Posted
技术标签:
【中文标题】WebRTC 数据通道未连接或未调用回调【英文标题】:WebRTC data channel not connecting or no callbacks being called 【发布时间】:2015-01-05 13:56:36 【问题描述】:在尝试使用 Objective C API 建立 WebRTC 数据通道时,我无法实际捕获任何 RTCDataChannelDelegate 回调。对等连接似乎一切正常,但我只到了成功添加对等连接流的地步。
我的步骤大致是:
创建报价:
_channel = [_connection createDataChannelWithLabel: @"offer-1"
config: [[RTCDataChannelInit alloc] init]];
_channel.delegate = _stateMachine;
[_connection createOfferWithDelegate: _stateMachine constraints: [[RTCMediaConstraints alloc] init]];
客户端 1 的 SDP 被发送到创建答案的客户端 2:
[_connection setRemoteDescriptionWithDelegate: _stateMachine sessionDescription: [[RTCSessionDescription alloc] initWithType: @"offer" sdp: sdp]];
[_connection createAnswerWithDelegate: _stateMachine constraints: [[RTCMediaConstraints alloc] init]];
客户端 2 的 SDP 发送回客户端 1:
[_connection setRemoteDescriptionWithDelegate: _stateMachine sessionDescription: [[RTCSessionDescription alloc] initWithType: @"answer" sdp: sdp]];
之后,我得到了添加信号稳定的媒体流。以前,在我的 POC 期间,我能够获得数据通道回调,但我不太确定我在这里缺少什么。
这是对等连接设置:
RTCPeerConnectionFactory* _cfactory = [[RTCPeerConnectionFactory alloc] init];
NSArray* mandatory = @[
[[RTCPair alloc] initWithKey:@"DtlsSrtpKeyAgreement" value:@"true"],
[[RTCPair alloc] initWithKey:@"internalSctpDataChannels" value:@"true"],
];
RTCMediaConstraints* pcConstraints = [[RTCMediaConstraints alloc] initWithMandatoryConstraints: mandatory
optionalConstraints: nil];
RTCICEServer* server = [[RTCICEServer alloc] initWithURI:[NSURL URLWithString:@"stun:stun.l.google.com:19302"]
username: @""
password: @""];
NSArray* servers = @[server];
_connection = [_cfactory peerConnectionWithICEServers: servers
constraints: pcConstraints
delegate: _stateMachine];
我的状态机实现了以下所有方法:
@protocol DelegateAggregator
<RTCPeerConnectionDelegate, RTCSessionDescriptionDelegate, RTCDataChannelDelegate, RTCStatsDelegate>
@end
这里有什么我遗漏的吗?似乎正在建立频道并添加了媒体流(我只想要数据),但没有任何回调。我可以启用更多日志记录吗?任何帮助将不胜感激!
【问题讨论】:
【参考方案1】:所以事实证明,我如何构建答案的关键错误在于发起 SDP 发送到客户端 1 的回调。我正在等待会话创建的回调到委托,以将我的答案发送回客户端 1事实证明,这还为时过早,候选人聚会还没有结束。我在委托中设置了要附加的回调,如下所示:
//WRONG
_tunnel.stateMachine.peerConnectionSessionCallback = ^(RTCPeerConnection* peerConnection, RTCSessionDescription* sdp, NSError* error)
SessionAnswer* answer = [[SessionAnswer alloc] init];
answer.sdp = [sdp description];
[queueManager sendEvent: answer];
;
正确的方法是等待这个事件:
_tunnel.stateMachine.peerConnectionICEGatheringCallback = ^(RTCPeerConnection* peerConnection, RTCICEGatheringState newState)
if (newState == RTCICEGatheringComplete)
SessionAnswer* answer = [[SessionAnswer alloc] init];
answer.sdp = [[peerConnection localDescription] description];
[queueManager sendEvent: answer];
;
一旦我以这种方式构建它,数据通道回调就会按预期触发。
【讨论】:
【参考方案2】:DtlsSrtpKeyAgreement
和internalSctpDataChannels
需要放入可选约束而不是强制。
为了设置数据通道,我也将RtpDataChannels
放在了可选中。
【讨论】:
看起来我得到了相同的结果,无论它们是可选的还是必需的。我已将我的 webrtc 版本升级到 7700,并正在使用 github.com/pristineio/webrtc-build-scripts 构建它应该使用 HAVE_SCTP 宏进行编译。有没有办法让我打开更多日志记录以查明真相? 我收到了来自我的提供客户的回复,我得到的唯一线路是:2014-11-14 22:47:49.908 Remotely[52330:4141871] peerConnection state change。以上是关于WebRTC 数据通道未连接或未调用回调的主要内容,如果未能解决你的问题,请参考以下文章
通过 websocket 或使用 WebRTC 的数据通道逐个字符发送?