音频会话中断后恢复 twilio 通话

Posted

技术标签:

【中文标题】音频会话中断后恢复 twilio 通话【英文标题】:Resuming twilio call after audio session interruption 【发布时间】:2015-09-15 07:48:46 【问题描述】:

我正在开发一个将 Twilio 用于电话的 VoIP 应用程序。我面临的问题是,如果 AVAudiosession 在通话过程中被中断,例如通过传入的 FaceTime 通话,那么我无法在中断结束后继续使用音频会话。通话没有断开,但听不到声音,麦克风也没有录制任何内容。

我已注册 AVAudioSessionInterruptionNotification 并在通知处理程序中执行以下操作:

 // get the user info dictionary
NSDictionary *interuptionDict = notification.userInfo;
// get the AVAudioSessionInterruptionTypeKey enum from the dictionary
NSInteger interuptionType     = [[interuptionDict valueForKey:AVAudioSessionInterruptionTypeKey] integerValue];
// decide what to do based on interruption type here...
switch (interuptionType)

    case AVAudioSessionInterruptionTypeBegan:

        DLog(@"Audio Session Interruption case started.");
        [self setAudioSessionActive:NO];
        break;

    case AVAudioSessionInterruptionTypeEnded:
    
        DLog(@"Audio Session Interruption case ended.");
        [self setAudioSessionActive:YES];
        break;
    
    default:
        DLog(@"Audio Session Interruption Notification case default.");
        break;


// Activate or deactivate the app's audio session
- (void)setAudioSessionActive:(BOOL)active

BOOL success = NO;
NSError *error = nil;
success = [[AVAudioSession sharedInstance] setActive:active error:&error];
if (error)

    DLog(@"Error setting audio session : %@", [error description]);

else if (success)

    DLog(@"Audio session state set successfully :")


我没有收到任何错误,但正在进行的通话不起作用。

我已阅读音频会话编程指南、音频的人机界面指南以及其他与音频相关的苹果文档。我相信我正在遵循正确的步骤。 请提供任何建议,因为我可能在这里遗漏了什么。

【问题讨论】:

调试这个问题的时候,你会得到什么DLog语句? 它记录“音频会话状态设置成功:”每次 【参考方案1】:

我是 Twilio 开发者网络的一员。从您的帖子中,不清楚是否在发生中断事件时调用通知。无论如何,您需要确保为 2 组通知注册您的音频会话单例。您目前只注册了一个通知。

先改一下

 // get the user info dictionary
NSDictionary *interuptionDict = notification.userInfo;
// get the AVAudioSessionInterruptionTypeKey enum from the dictionary
NSInteger interuptionType     = [[interuptionDict valueForKey:AVAudioSessionInterruptionTypeKey] integerValue];

到这里

 NSNumber *interruptionType = [notification.userInfo objectForKey:AVAudioSessionInterruptionTypeKey];
    NSNumber *interruptionOption = [notification.userInfo objectForKey:AVAudioSessionInterruptionOptionKey];

接下来,您需要使用 KVO API 注册两组通知。

通知1(你有这个):AVAudioSessionInterruptionNotification

[[NSNotificationCenter defaultCenter] addObserver:self
                                         selector:@selector(handleAudioSessionInterruption:)
                                             name:AVAudioSessionInterruptionNotification
                                           object:aSession];

通知2(添加这个):AVAudioSessionMediaServicesWereResetNotification

[[NSNotificationCenter defaultCenter] addObserver:self
                                         selector:@selector(handleMediaServicesReset)
                                             name:AVAudioSessionMediaServicesWereResetNotification
                                           object:aSession];

根据您是否接听或拒绝来电,系统可能会暂停活动的音频会话或取消分配它。这两个通知处理这两种情况。有关 AVAudioSessionMediaServicesWereResetNotification 的更多信息,请参阅this 链接

如果发生通知,您也无需将音频会话设置为非活动状态,系统会为您执行此操作。当有来电时,应用程序会移至后台。当它返回时,您应该在恢复 audioSession 之前允许 1-2 秒以确保线程安全。所以你的 switch 语句应该是这样的

    switch (interruptionType.unsignedIntegerValue) 
            case AVAudioSessionInterruptionTypeBegan:
                // • Your session is already inactive, you can update the UI if necessary
             break;
            case AVAudioSessionInterruptionTypeEnded:

                if (interruptionOption.unsignedIntegerValue == AVAudioSessionInterruptionOptionShouldResume) 
 dispatch_after(dispatch_time(DISPATCH_TIME_NOW, 1), dispatch_get_main_queue(), ^
                   // • Update the session here 
                     [self setAudioSessionActive:YES];

                );
                
             break;
            default:
                break;
        

最后,在调用第二个通知的方法中,确保将音频会话重置为活动状态。

- (void)handleMediaServicesReset 
        [self setAudioSessionActive:YES];

希望对您有所帮助!如果您还有其他问题,请告诉我。

【讨论】:

嗨 sraval ,我根据您的建议对代码进行了更改后尝试了该场景。但同样的问题仍然存在。 Mithun,有来电时通知您吗?换句话说,您是否看到“音频会话中断案例已启动”。每当有来电时在您的控制台中? 嗨 sraval ,是的,每当有 FaceTime 通话进入并且应用程序进入后台时,都会收到音频会话中断通知。同样,当中断结束时,会收到通知。因此,我尝试将音频会话设置为活动状态,并且也返回成功。但是没有音频输入或输出 知道了。在这种情况下,请参阅此***.com/questions/27200453/…,他遇到了类似的问题,并将方法移至委托解决了该问题。 嗨,sraval .. 抱歉回复晚了。希望你还在关注这个。我浏览了上面的帖子并尝试了一个解决方案,但问题仍然存在。另外,您能否在 Twilio SDK 附带的 Basic Phone 应用程序中尝试上述场景?因为我认为这是一个基本用例,应该在 SDK 本身中处理,或者至少应该在 Twilio 开发人员材料中提供明确的信息

以上是关于音频会话中断后恢复 twilio 通话的主要内容,如果未能解决你的问题,请参考以下文章

在 Agora.io 视频通话后 Unity VideoPlayer 音频中断

中断结束后恢复 AVAudioplayer

播放 youtube 视频后 iPhone 在 Play&Record 中恢复 AudioSession

音频会话中断通知

iOS 上的 AVCapture 会话中没有音频

iOS音频问题通用配置