音频会话中断后恢复 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 音频中断