当前位置: 首页 > 知识库问答 >
问题:

CallKit:使用WebRTC时没有声音

赏阳嘉
2023-03-14

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

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

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

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

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

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

共有3个答案

支阳波
2023-03-14

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

苹果对呼叫套件文档的建议

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

所以我们需要等待一两秒钟,然后在performAnswerCallAction中完成动作

厉永宁
2023-03-14

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

首先,我将“完成”的调用延迟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];
        }];

});

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

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

邓仲卿
2023-03-14

需要做几个步骤来以正确的方式连接webrtc和call kit:首先,您必须使用RTCAudioTrack并添加RTCAudio会话来处理音频。旧的遗留RTCAudio会话直接添加到RTCPeerConnection作品中,但它不是这样做的首选方法。第二件事是使用manualAudio。当应用程序启动时,您应该更改RTCAudio会话上的useManualAudio标志:

RTCAudioSession.sharedSession().useManualAudio = 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
 类似资料:
  • 我试图让callkit在传入呼叫时与webrtc一起工作,但当我从锁定屏幕接收呼叫并接受它时,在我以前台模式运行应用程序之前,不会有声音。我已配置audiosession向RTCAudoSession发送通知,但它不起作用。你有解决办法吗?

  • 如果我们在前台启动应用程序,一切都很好。但是,当应用程序之前被杀死并通过在锁定屏幕上接收PushKit通知而重新启动时,会出现问题。 当应用程序收到PushKit通知时,我们将显示CallKit UI。这是正确的。用户可以通过WebRTC接听电话并建立连接。但是根本没有音频。 奇怪的是,如果用户通过点击应用程序图标从CallKit屏幕打开应用程序,音频就会启动并按预期工作。看来问题出在音频会话配置

  • 这是一个会议应用程序,我正在启动传出呼叫,以使我的VoIP呼叫具有高优先级,并且在我进行VoIP呼叫时不会中断传入呼叫。 我在我的应用程序中使用WebRTC CallKit。我开始了一个呼叫,当我按下锁定/电源按钮,然后CallKit呼叫断开,我的Voip呼叫音频路由更改为接收器并保持不变。 为什么要锁定iPhone以终止通话。 这是我的代码。

  • 我在这里尝试了许多解决方案,但没有人奏效。WebRTC工作正常,我在设备锁定时接听电话时处于连接状态,解锁后音频打开,视频启动。当屏幕保持锁定状态时,我如何只能获得音频? 我已启用RTCAdioSession,并在呼叫停止时将其禁用。 当设备第一次解锁时,它工作得很好,当我把它锁回去时,我得到了音频。但是第一次,当我接听来自CallKit的电话时,它不起作用。它只在设备解锁后才开始工作。

  • 我正在开发webRTC,我正在本地网络上的两个Android设备之间进行实时流,它对我来说工作得很好,除了音质问题,声音中有噪音和回声。如果我在一端使用免提,它会变得更好,但我不想使用免提。 那么我该如何提高音质,有什么技术可以提高音质。它还表示,webRTC内置了回声消除功能,如果这是回声仍然存在的原因。

  • 更新 我在这里找到了一个使用的高通滤波器示例。在我的代码中这样实现它。 在我实际测试低声音是否被滤波器静音之前,我遇到了一个问题。使用几秒钟后将音频完全静音。我尝试了0,1500等。几秒钟后,它会变得安静。 原始帖子 我使用下面的约束来抑制噪音。 但我也想静音一些更高的频率。即使我在某个表面上慢慢移动手机,麦克风也会捕捉到噪音并将其发送给其他同伴。它甚至会捕捉到我的呼吸声,并在我将其放在支票附近时