当接听第二个电话并保持第一个电话时,CallKit没有声音

时间:2017-10-16 12:32:22

标签: voip rtp avaudiosession callkit

在我的VOIP应用程序中开始使用CallKit时,我遇到了多次调用的问题。

当有一对一的VOIP通话时,声音正常。但是一旦一方获得另一个VOIP呼叫,并选择保持和接受选项;第一个呼叫被成功保持,第二个呼叫被应答;但声音现在关闭了。即使在通话之间交换也不起作用。并且删除一个电话也不起作用。 我正在使用 RTP 作为语音。

我尝试放置断点并检查AVAudioSession的类别和模式是否正确。

在控制台中,我可以在我的终端检查有多个电话的设备,停止发送声音包。

我在提供商的 reportNewIncomingCallWithUUID CXStartCallAction 之前启用VOIP。

与GSM通话相同的情况。如果有一对一的VOIP通话,声音正常,一方收到GSM通话,用户选择保持和接听选项,GSM通话中的声音工作正常。但是,如果用户将VOIP呼叫作为活动状态并通过交换呼叫将GSM呼叫置于保持状态,则VOIP呼叫中没有声音。交换呼叫并使GSM呼叫处于活动状态,声音再次正常工作。但VOIP呼叫没有声音。

在这种情况下,我们将 AVAudioSessionInterruptionTypeBegan ,但永远不会调用 AVAudioSessionInterruptionTypeEnded 。即使在GSM通话结束后也是如此。

有没有人遇到过类似的问题?

1 个答案:

答案 0 :(得分:1)

有同样的问题。如果我有1个活动呼叫,则新呼叫即将进入,我点击保持和接受。新的呼叫有效,但在CallKit中使用Swap后,音频停止工作。

经过长时间的调试,找到了实际上音频通过CallKit本地接口进行交换调用的地方 - 这是来自provider:performSetHeldCallAction:协议的CXProviderDelegate方法。

在我的情况下,我使用[audioController deactivateAudioSession]方法进行了OnHold的调用。

但是我发现当通过CallKit点击provider:performSetHeldCallAction:按钮时,同样的方法Swap被激活用于其他被激活的呼叫(来自OnHold状态)。

所以在我的情况下,我首先切换保持呼叫(它将呼叫置于保持状态或将其置于保持状态)。 然后我检查什么是通话条件(无论是否保持),然后分别停用或激活音频。

通常它看起来像这样:

- (void)provider:(CXProvider *)provider performSetHeldCallAction:(CXSetHeldCallAction *)action {
    SomeCallClass *call = [self.callManager callWithUUID:action.callUUID];
    if (!call) {
        [action fail];
        return;
    }

    NSError *holdError;
    [call toggleHold:&holdError];

    if (holdError) {
        [action fail];
    } else {

        if (call.onHold) 
            [self.audioController deactivateAudioSession];
        else
            [self.audioController activateAudioSession];
        [action fulfill];
    }
}

此代码应位于作为CallKit提供程序委托的类中。