Ios CallKit:使用WebRTC时没有声音

Ios CallKit:使用WebRTC时没有声音,ios,objective-c,audio,webrtc,callkit,Ios,Objective C,Audio,Webrtc,Callkit,我们的项目使用WebRTC进行VOIP呼叫,在访问CallKit框架之前,它工作良好。但当我试图访问CallKit框架时,出现了双方都听不到对方讲话的情况。当我移除CallKit时,一切都恢复正常 CallKit的应答按钮与项目中的原始应答按钮功能相同 令我惊讶的是,没有必要听到任何声音。有时一切正常,但有时会有问题。嗯,出现问题的可能性更大 我发现下面的流程图,我怀疑问题在于函数调用的顺序。但我不知道WebRTC如何对应于图中的函数。 此外,我很好奇套接字不稳定是否会导致CallKit框架异

我们的项目使用WebRTC进行VOIP呼叫,在访问CallKit框架之前,它工作良好。但当我试图访问CallKit框架时,出现了双方都听不到对方讲话的情况。当我移除CallKit时,一切都恢复正常

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

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

我发现下面的流程图,我怀疑问题在于函数调用的顺序。但我不知道WebRTC如何对应于图中的函数。

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

请原谅我英语不好,但是这个问题已经困扰了我好几天了,我不知道到底是哪里出了问题,是不是在哪里与CallKit框架冲突


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

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

首先,我将“fulfill”的调用延迟1秒(注意,此时间不能少于1秒)

其次,我还将我的网络请求呼叫延迟了一秒钟(这里比前一次延迟的时间长)

}))

这样,我的问题就解决了


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

要以正确的方式连接webrtc和callkit,需要执行几个步骤: 首先,您必须使用RTCAdioTrack并添加RTCAdioSession来处理音频。直接添加到RTPeerConnection中的旧旧的传统RTCAdioSession可以工作,但它不是首选的方法。 第二件事是使用手动音频。启动应用程序时,您应更改RTCAdioSession上的useManualAudio标志:

RTCAdioSession.sharedSession().useManaulAudio=true
这使您可以推迟音频,直到CallKit通知音频会话已激活,因此在ProviderDelegate中,您应该实现以下方法:

(void)provider:(CXProvider*)provider didActivateAudioSession:(AVAudioSession*)audioSession
RTCAudioSession.sharedSession().didActivecated(audioSession)
RTCAudioSession.sharedSession().isAudioEnabled=true
对于第二个音频委托方法,请不要忘记添加:

(void)提供程序:(CXProvider*)提供程序会话:(AVAudioSession*)音频会话
RTCAudioSession.sharedSession().DidDeActivated(audioSession)
RTCAudioSession.sharedSession().isAudioEnabled=false

苹果建议我们等到连接建立后再执行PerformanceWerAction。以下是来源

如果呼叫接收人在应用程序与您的服务器建立连接之前应答,请不要立即完成发送给您的代理的provider:performAnswerCallAction:method的cAnswerCallAction对象。相反,等待建立连接,然后完成该对象。当它等待你的应用程序完成请求时,传入呼叫界面让用户知道呼叫正在连接,但尚未准备就绪


因此,我们需要等待一两秒钟,然后才能完成PerformancesWerCallAction

中的操作。很抱歉,只有在用户挂断时才调用了didDeactivate。如何控制webrtc的音频?如何在建立webrtc连接时使用RTCAdioSession?您能给出代码示例吗?如果您不知道如何通过WebRTC将CallKit呼叫立即设置为speaker,这就是解决方案。另外,当您注意到CallKit和RTCAdioSession的AVAudioSession没有相同的内存地址时,尽管它们最初似乎使用共享实例。当人们使用与我最终找到此帖子之前相同的搜索关键字时,此回复也可能有助于他们找到此帖子;)当用户按下锁定按钮时,CallKit呼叫将断开。知道吗?我有个奇怪的问题。这是第一次当设备被关闭并锁定时,没有音频问题,一切正常。但是,如果我从CallKit屏幕结束通话并再次收到来电,则通话中没有音频。双方都听不到任何声音,尽管叫了didActivateAudioSession。我被困在这里了。任何帮助都会很有帮助。你解决问题了吗?我有一个奇怪的问题。这是第一次当设备被关闭并锁定时,没有音频问题,一切正常。但是,如果我从CallKit屏幕结束通话并再次收到来电,则通话中没有音频。双方都听不到任何声音,尽管叫了didActivateAudioSession。我被困在这里了。任何帮助都会非常有用。因为有时音频在未激活之前启动,所以请延迟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];
        }];