
我的iPad声音应用程序(iOS 7.1)可以在后台录制. 只要在后台录制不中断,一切都可以. 例如,如果某人有(愚蠢的?)想法在录音时开始听音乐.
我试图以不同的方式来管理这种中断,但没有成功. 问题是
- (void)audioRecorderEndInterruption:(AVAudioPlayer *)p withOptions:(NSUInteger)flags
当应用程序在后台发生中断时,不会触发
. 然后,我尝试在另一种解决方案中,将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: ,但在中断结束时不会触发(应在InterruptionType设置为AVAudioSessionInterruptionTypeEnded的情况下触发)
为避免此问题,我决定在中断开始时设置一个标志(interruptionBeganWhileInBackgroundMode),以使应用程序获知在到达前台时发生了中断. 这样我就可以管理中断的结束了.
这似乎很聪明,但事实并非如此!这就是为什么...

我尝试了两种实现方式.
解决方案1.在中断开始时将[记录器暂停]放入handleInterruption: 中,并在设置了中断标志时在comeingForeground: 方法中管理[记录器记录]. 在这种情况下,当应用程序返回到前台时,录制会立即继续进行,但不是恢复,而是由录制器擦除文件并重新开始新的录制,因此中断之前录制的所有内容都会丢失.
解决方案2.在handleInterruption中放置一个[记录器停止]: 当中断开始时,要保存文件,以确保保留记录的数据. 该记录已保存,但是当应用程序进入前台时,它将停顿约十秒钟,然后用户才能再次进行交互,就好像有一个使UI冻结的进程(保存文件?)一样.
最后一点: 在此应用程序的iPhone版本中,我有完全相同的问题: 当应用程序为前台且发生电话时,一切正常. 但是,当我的应用程序处于后台时发生电话呼叫时,我会看到与iPad版本相同的不良行为.
我注意到,iOS 7中的Apple语音备忘录应用程序可以正确管理这些背景中断(停止并保存录音),尽管它在进入前景时显示00:00:00文件长度. iTalk应用程序可以完美地管理它,当到达前台时会自动恢复记录.
有人为后台录制应用程序的音频中断管理找到解决方法吗?我在许多开发人员网站中找到了很在寻找它,但是没有答案……谢谢!
解决方案
我自己一直在经历同样的问题. 似乎iOS7 AVAudioRecorder中存在一个如何处理中断的错误. 它不会关闭文件iphone录音软件照相不中断,而是像我认为文档所述那样暂停了文件. 我还无法弄清是什么原因使应用程序重新回到前台. 就我而言,我会在10秒后看到AVAudioRecorder完成(将成功标志设置为NO).
我最终使用Audio Queues重写了录音机. 我在这里(git@github.com: vecter / Audio-Queue-Services-Example.git)找到了一些示例代码,这些示例代码有助于在Objective-C环境中进行设置,Apple SpeakHere演示中有一些代码可以处理中断通知

从本质上讲,我在中断开始时停止记录,并为用户打开一个警报以保存文件. 如果在应用程序处于后台运行时开始中断,则此警报将推迟到通过UIApplicationDidBecomeActiveNotification为止.
要注意的另一件事是,音频队列中似乎有一个小错误,有时AudioQueueStart方法将返回-50. 如果您添加
AudioSessionInitialize(NULL, NULL,nil,(__bridge void *)(self));
UInt32 sessionCategory = kAudioSessionCategory_PlayAndRecord;
AudioSessionSetProperty(kAudioSessionProperty_AudioCategory,
sizeof(sessionCategory),
&sessionCategory
);
AudioSessionSetActive(true);
在使用任何AudioQueue方法之前,错误都会消失. 这些方法被标记为已弃用,但似乎是必需的.
我的iPad应用程序(iOS版本7.1)的声音可以同时在后台录制. 一切正常,只记录下来,而不在后台中断. 例如,如果某人有一个(愚蠢的?)主意,请在听音乐的同时开始录制一些东西.
我试图以不同的方式来管理这种中断,但没有成功. 问题在于
- (无效)audioRecorderEndInterruption:(AVAudioPlayer *)p withOptions:(NSUInteger)标志
当应用程序在后台中断时
永远不会被解雇. 然后,我尝试在另一个解决方案中实现AVAudioSessionInterruptionNotification和handleInterruption: 方法

- (无效)viewDidAppear:(BOOL)
{
......
AVAudioSession *会话= [AVAudioSession sharedInstance];
[NSNotificationCenter defaultCenter]的addObserver:自我
选择:@选择(handleInterruption :)
名称:AVAudioSessionInterruptionNotification
对象:会议];
.......
}
//中断处理 - (无效)handleInterruption:(NSNotification *)的通知
{
尝试{
UINT8 theInterruptionType = [[notification.userInfo valueForKey:AVAudioSessionInterruptionTypeKey]的intValue];
的NSLog(@会话中断,> ---%S --- \\ n,theInterruptionType == AVAudioSessionInterruptionTypeBegan开始中断:结束中断); .... MANAGE开始中断
interruptionBeganWhileInBackgroundMode = TRUE; }
如果(theInterruptionType == AVAudioSessionInterruptionTypeEnded){ .... MANAGE中断结束 }
}赶上(CAXException E){
焦炭BUF [256];
fprintf中(标准错误,错误:%s(%S)\\ n,e.mOperation,e.FormatError(BUF));
}
}
在这种情况下,handleInterruption: 当中断开始时,但不是在中断结束时(触发并设置为AVAudioSessionInterruptionTypeEnded的InterruptionType被触发),
为避免此问题,我决定在中断开始被应用程序通知时设置一个标记(interruptionBeganWhileInBackgroundMode),并且在将来出现问题时发生中断. 因此,我可以管理中断的结束.
这看起来很聪明,但事实并非如此!为什么这样...
我尝试了两种实现方法.
解决方案1即可. 在中断开始时将[记录暂停]放入handleInterruption: 在中断标志被设置时,在comeingForeground中管理[记录记录].
在这种情况下,在进行录制时立即应用潜在客户,但不要恢复,而是录制已删除的文件并重新开始新的录制,以使先前的录制中断并丢失所有内容
解决方案2.放置handleInterruption [记录停止]: 中断开始时iphone录音软件照相不中断,要保存文件,必须保留记录的数据. 该记录已保存,但是当应用程序进入前台时,它将停顿约10秒钟,然后用户可以再次进行交互,就像有一个进程(保存文件?)保持冻结的UI一样.
最后一点: 在此应用程序的iPhone版本中,我有完全相同的问题: 当该应用程序可以使用手机时,一切正常. 但是,当在后台调用我的应用程序时,我在iPad版本中看到同样的不良行为.

我注意到,尽管有可能,苹果的语音备忘录在iOS7应用中正确处理了这些背景中断(停止并保存录音),显示的文件长度为00:00:00. iTalk应用程序可以完美地管理它,并在将来有希望时自动恢复录制.
有人找到音频中断管理后台运行记录应用程序的解决方案吗?我在许多开发人员的网站上发现了很在寻找它,但是没有答案...谢谢!
解决方案
我通过了同样的问题. 看来,如果iOS7中的AVAudioRecorder与中断有关,没有任何错误. 不要挂起,而是关闭文件,因为我认为该文件应该挂起. 当应用程序回到前台时,我还无法弄清楚什么是拖延的. 就我而言,我将在10秒后看到AVAudioRecorder完成(设置为NO成功信号).
我最终使用音频队列重写了录音机. 我在这里找到了一些示例代码(git@github.com: vecter / audio queue service-Example.git),以及一个Objective-C环境和Apple SpeakHere演示设置,它有助于一些代码来处理中断通知.
基本上,我在中断的录制开始时停了下来,并为用户打开警报以保存文件. 如果启动了中断并且应用程序处于后台,则警报将延迟到UIApplicationDidBecomeActiveNotification传递为止.
要注意的另一件事是,当音频队列的AudioQueueStart方法返回-50时,似乎有一个小错误. 如果您添加
AudioSessionInitialize(NULL,NULL,零,(__桥无效*)(个体经营));
UInt32的sessionCategory = kAudioSessionCategory_PlayAndRecord;
AudioSessionSetProperty(kAudioSessionProperty_AudioCategory,
的sizeof(sessionCategory)
&安培; sessionCategory
);
AudioSessionSetActive(真);
在使用任何AudioQueue方法之前,该错误消失了. 这些方法被标记为pcated de $ P $,但这似乎是必要的.
本文地址: IT之家»当录制音频的iPhone应用程序在后台中断时
本文来自电脑杂谈,转载请注明本文网址:
https://www.pc-fly.com/a/shouji/article-235647-1.html
少读书
太帅~~~~
表明美国的死党已经不听他的话了