iOS应用程序在后台录制时audio中断

我的iPad声音应用程序(iOS 7.1)能够在后台录制。 只要在后台录制不中断,一切都可以。 例如,如果有人(愚蠢?)的想法,开始听音乐,而录音的东西。

我试图以不同的方式pipe理这种中断,但没有成功。 问题是,

- (void)audioRecorderEndInterruption:(AVAudioPlayer *)p withOptions:(NSUInteger)flags 

当应用程序在后台发生中断时,永远不会被触发。 然后,我尝试在另一个解决scheme中实现AVAudioSessionInterruptionNotification和handleInterruption:方法

 - (void) viewDidAppear:(BOOL)animated { ...... AVAudioSession *session=[AVAudioSession sharedInstance]; [[NSNotificationCenter defaultCenter] addObserver:self selector:@selector(handleInterruption:) name:AVAudioSessionInterruptionNotification object:session]; ....... } // interruption handling - (void)handleInterruption:(NSNotification *)notification { try { UInt8 theInterruptionType = [[notification.userInfo valueForKey:AVAudioSessionInterruptionTypeKey] intValue]; NSLog(@"Session interrupted > --- %s ---\n", theInterruptionType == AVAudioSessionInterruptionTypeBegan ? "Begin Interruption" : "End Interruption"); .... MANAGE interruption begin interruptionBeganWhileInBackgroundMode = TRUE; } if (theInterruptionType == AVAudioSessionInterruptionTypeEnded) { .... MANAGE interruption end } } catch (CAXException e) { char buf[256]; fprintf(stderr, "Error: %s (%s)\n", e.mOperation, e.FormatError(buf)); } } 

在这种情况下,当中断开始时,handleInterruption:会被触发,但当中断结束时不会中断(使用设置为AVAudioSessionInterruptionTypeEnded的InterruptType来触发)

为了避免这个问题,我决定在中断开始时设置一个标志( interruptBeganWhileInBackgroundMode ),让应用程序知道前台出现中断。 这样我可以pipe理中断的结束。

它看起来很聪明,但不是! 这是为什么…

我尝试了两个实现。

解决scheme1 。 在[handleInterruption]中放置一个[logging器暂停]:当中断开始时,并且在设置中断标志时,在comingForeground:方法中pipe理[logging器logging]。 在这种情况下,应用程序回到前台时logging正在进行, 但是,而不是恢复,logging器擦除文件并重新开始新的logging,以便在中断之前logging的所有内容都将丢失

解决scheme2 。 把一个[录音机停止]放在句柄中:当中断开始时,保存文件,确保保存logging的数据。 这个logging是保存的, 但是当应用程序到达前台时,它会停顿大约十秒钟,然后用户可以再次交互 ,就像有一个进程(文件保存?),以保持UI冻结。

最后一点:我在这个应用程序的iPhone版本中有完全相同的问题:当应用程序是前台和电话发生时,一切正常。 但是,当我的应用程序是后台发生电话时,我看到了与iPad版本相同的不良行为。

我注意到,iOS7中的苹果语音备忘录应用程序正确pipe理这些背景中断(即停止并保存录制),尽pipe它在前台显示00:00:00文件长度。 iTalk应用程序完美地pipe理它,当来到前台时自动恢复logging。

有没有人find解决后台录音应用audio中断pipe理的解决方法? 我发现很多人在许多开发人员的网站上寻找,但没有答案…谢谢!

我自己也经历过同样的问题。 看起来好像在iOS7 AVAudioRecorder中存在一个如何处理中断的错误。 而不是像我相信文档说的那样暂停,它会closures文件。 我一直无法弄清楚什么是拖延应用程序,当它回到前台。 在我的情况下,我会看到AVAudioRecorder完成(与成功标志设置为否),10秒后。

我结束了使用audio队列重写录音机。 我在这里find了一些示例代码(git@github.com:vecter / Audio-Queue-Services-Example.git),它帮助在Objective-C环境中进行设置,Apple SpeakHere演示有一些代码来处理中断通知。

从本质上讲,我正在停止录制中断开始,并打开一个警告,用户保存该文件。 如果在应用程序处于后台时启动中断,则会延迟此警报,直到通过UIApplicationDidBecomeActiveNotification。

另外需要注意的是,Audio Queue中似乎存在一个小错误,即AudioQueueStart方法有时会返回-50。 如果你添加

 AudioSessionInitialize(NULL, NULL,nil,(__bridge void *)(self)); UInt32 sessionCategory = kAudioSessionCategory_PlayAndRecord; AudioSessionSetProperty(kAudioSessionProperty_AudioCategory, sizeof(sessionCategory), &sessionCategory ); AudioSessionSetActive(true); 

在任何AudioQueue方法之前,错误消失。 这些方法被标记为已弃用,但似乎是必要的。

不知道/认为这将与该主题的原作者有关,但这是我的经验:

由于AVAudioSessionInterruptionNotification的事情,我在这里结束了; 开心的味道如预期的那样出现了,但是却没有。 在我的情况下,这是因为我使用了两个AVPlayer实例:一个播放音乐,另一个播放静音,而第一个尝试开始stream式传输新的音轨(否则iOS会在后台暂停我的应用,如果下一个音轨加载没有发生得很快)。

发现这不是最明智的解决scheme,它以某种方式混淆了通知系统。 放弃第二个AVPlayer(沉默打一个)导致被触发如预期。 当然,我发现通知问题的答案/解决scheme,但我现在留下了旧的… 🙂