CallKit:使用WebRTC时没有声音

问题描述 投票:2回答:2

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

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

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

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

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

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

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

ios objective-c audio webrtc callkit
2个回答
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];
        }];

});

这样,我的问题就解决了。

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


3
投票

要以正确的方式连接webrtc和callkit,需要采取以下措施:首先,您必须使用RTCAudioTrack并添加RTCAudioSession来处理音频。旧的遗留RTCAudioSession直接添加到RTCPeerConnection工作,但它不是一种方法来做到这一点。第二件事是使用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
© www.soinside.com 2019 - 2024. All rights reserved.