CallKit:使用WebRTC时没有声音

时间:2018-01-03 01:50:40

标签: ios objective-c audio webrtc callkit

我们的项目使用WebRTC进行VOIP调用,它在访问CallKit框架之前工作正常。但是当我试图访问CallKit框架时,有一种情况是双方都无法听到对方的讲话。当我删除CallKit时,一切都恢复正常。

CallKit的答案按钮与项目中的原始答案按钮功能相同。

令我惊讶的是没有必要听到没有声音。有时一切都很正常,但有时会出现问题。嗯,问题的可能性更大。

我发现了以下流程图,我怀疑问题在于函数调用的顺序。但我不知道WebRTC如何与图中的功能相对应 enter image description here

此外,我很好奇套接字不稳定是否会导致CallKit框架异常工作

请原谅我英文不好,但是这个问题已经困扰了我好几天了,我不知道究竟哪里出了问题,是不是跟CallKit框架发生了冲突?

希望你能帮助我,非常感谢你!

3 个答案:

答案 0 :(得分:3)

最后,我解决了这个问题,但我仍然不明白为什么可以解决这个问题。下面是我的解决方案:

首先,我推迟了"履行" 1秒(请注意,此时间不能少于1秒

- (void)provider:(CXProvider *)provider performAnswerCallAction:(CXAnswerCallAction *)action {

if (self.delegate && [self.delegate respondsToSelector:@selector(callKitManager:refreshCurrentCallStatus:)]) {
    [self.delegate callKitManager:self refreshCurrentCallStatus:EUCCallKitStatusAnswerAccept];
}

dispatch_after(dispatch_time(DISPATCH_TIME_NOW, (int64_t)(1 * NSEC_PER_SEC)), dispatch_get_main_queue(), ^{
    [action fulfill];
});}

其次,我还将网络请求延迟了一秒钟(此处比前一个更长)

 dispatch_after(dispatch_time(DISPATCH_TIME_NOW, (int64_t)(1.0 * NSEC_PER_SEC)), dispatch_get_main_queue(), ^{
  [self.peerConnection offerForConstraints:[self offerConstraintsRestartIce:NO] completionHandler:^(RTCSessionDescription * _Nullable sdp, NSError * _Nullable error) {

  [self peerConnection:self.peerConnection didCreateSessionDescription:sdp error:error];
        }];

});

通过这种方式,我的问题得以解决。

如果您知道为什么这可以解决这个问题,请评论我,谢谢!

答案 1 :(得分:3)

以正确的方式连接webrtc和callkit的步骤很少: 首先,您必须使用RTCAudioTrack并添加RTCAudioSession来处理音频。直接添加到RTCPeerConnection的旧式RTCAudioSession可以正常工作,但是不希望这样做。 第二件事是使用manualAudio。启动应用程序后,您应该在RTCAudioSession上更改useManualAudio标志:

RTCAudioSession.sharedSession().useManaulAudio = true

这使您可以将音频推迟到CallKit通知已激活音频会话之前,因此在ProviderDelegate内部,您应该实现以下方法:

(void)provider:(CXProvider *)provider didActivateAudioSession:(AVAudioSession *)audioSession
RTCAudioSession.sharedSession().didActivecated(audioSession)
RTCAudioSession.sharedSession().isAudioEnabled = true

第二种音频委托方法请不要忘记添加:

(void)provider:(CXProvider *)provider didDeactivateAudioSession:(AVAudioSession *)audioSession
RTCAudioSession.sharedSession().didDeactivecated(audioSession)
RTCAudioSession.sharedSession().isAudioEnabled = false

答案 2 :(得分:0)

Apple建议我们等到Connection建立之后再执行performAnswerAction。以下是来源

Apple Suggestion for Call Kit Documentation

如果在应用程序与服务器建立连接之前,呼叫的接听者应答,则不要立即完成发送给委托的provider:performAnswerCallAction:方法的CXAnswerCallAction对象。而是要等到建立连接再实现该对象。在等待您的应用程序完成请求的过程中,来电界面使用户知道呼叫正在连接,但尚未准备就绪。

因此,我们需要等待一两秒钟,然后才能在 performAnswerCallAction

中完成操作
相关问题