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

音频会话中断后恢复twilio呼叫

百里光熙
2023-03-14

我正在开发一个VoIP应用程序,使用Twilio进行电话。我面临的问题是,如果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 :")
}
}

我没有得到任何错误,但正在进行的调用只是不工作。

我已经阅读了音频会话编程指南、音频人机界面指南和其他与音频相关的苹果文档。我相信我正在遵循正确的步骤。请给出任何建议,因为我可能会错过这里。

共有1个答案

毛缪文
2023-03-14

我是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];
[[NSNotificationCenter defaultCenter] addObserver:self
                                         selector:@selector(handleAudioSessionInterruption:)
                                             name:AVAudioSessionInterruptionNotification
                                           object:aSession];
[[NSNotificationCenter defaultCenter] addObserver:self
                                         selector:@selector(handleMediaServicesReset)
                                             name:AVAudioSessionMediaServicesWereResetNotification
                                           object:aSession];

系统可能会暂停一个活动的音频会话,或者根据您是否应答或拒绝一个传入呼叫来释放它。这两个通知处理这两种情况。有关AVAudioSessionMediaServicesWereResetNotification的更多信息,请参见此链接

如果发生通知,您也不需要将音频会话设置为非活动,系统会为您执行此操作。当有电话打进来时,应用程序会移到后台。当它返回时,为了线程安全,您应该在恢复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];
}

希望能有所帮助!如果你还有其他问题请告诉我。

 类似资料:
  • 我相信答案是否定的,但是Twilio提供暂停/恢复录音的能力吗?用例是记录一个呼叫,但在收集敏感信息时暂停记录。从REST文档来看,它似乎不是一个受支持的功能。我想有人可能已经为这个要求找到了一些选择。

  • 我有一个cordova应用程序,我有一个登录页面和一个登录用户的内页。每当用户会话消失时,它就会请求登录信息。如何防止ths cordova应用程序在重启移动应用程序时删除会话uppon重启或恢复cookie和会话信息?所以登录屏幕不会每次都出现?

  • 我正在为我的项目实现视频调用API,当我通过“生成访问令牌”选项从 https://www.twilio.com/user/account/video/dev-tools/testing-tools 创建访问令牌时,它将为我提供新生成的令牌,当我使用它时,如下所示 这对我很有用。 现在,当我使用第二个选项“使用PHP通过帮助程序库生成访问令牌”并尝试使用 它还会为我生成令牌,但当我使用生成的令牌作

  • Twilio标记语言清楚地定义了如何将来电连接到公共会议室。 但我想同时拨打几个电话并加入其中。如果我在标记语言中使用“dial”动词,我会接到几个连续的呼叫,但我希望它们是并行的。 我的应用程序的基本操作是接到会议领导的电话,主动对接会议各方。

  • 对于我的Twilio号码,我有TwiML应用程序,我使用Flask作为后端来处理来电的URL。到目前为止,我的目标是为它挂断的每个进线量创建行为(并发送短信,但这目前并不重要)我使用: 带有挂断的Twiml响应以“忙信号”结束。 Twiml的拒绝响应以消息“您拨打的电话号码不可用”结尾。 使用twilio rest客户端(如twilio的示例中)客户端。电话。更新(“CAe1644a7eed508