我正在编写一个使用AVAudioRecorder
类的应用程序。除了拨打电话外,它的效果很好。我按照苹果公司使用AVAudioRecorderDelegate方法的指导方针处理这个问题。
– (void) audioRecorderBeginInterruption:
– (void) audioRecorderEndInterruption:
它工作得很好,直到中断结束,我试图通过再次调用记录方法来“恢复”记录(根据文档)。然而,它并没有恢复我的录音,而是抛弃旧的录音,并在它的位置启动一个全新的录音。我无法找到这个问题的解决方案,如果有人想出这个问题,或者如果它是苹果公司的AVAudioRecorder
的错误请告诉我。我真的希望我不必用AudioQueues
写这个。
谢谢
看起来它是苹果API的一个错误。非常有趣....
这是我们从支持票中收到的回复。
“你描述的行为是一个错误,不幸的是,API中没有任何东西你可以改变以实际附加到原始录音。中断导致只捕获中断后录制的音频。你可以尝试停止中断后记录,然后创建一个新文件,之后至少不会导致用户丢失任何信息,但结果将是两个单独的文件。
请为此问题提交错误报告,因为当iOS工程师正在评估要解决的修复程序的关键功能时,外部开发人员提交的错误至关重要。它很容易重现,但如果你有一个测试应用程序,你可以包括请做,iOS工程,如有直接显示错误的应用程序。 “
我的解决方案是:
[[NSNotificationCenter defaultCenter] addObserver:self
selector:@selector(audioSessionInterruptionNotification:)
name:AVAudioSessionInterruptionNotification
object:audioSession];
-(void)audioSessionInterruptionNotification:(NSNotification*)notification {
NSString* seccReason = @"";
//Check the type of notification, especially if you are sending multiple AVAudioSession events here
NSLog(@"Interruption notification name %@", notification.name);
NSError *err = noErr;
if ([notification.name isEqualToString:AVAudioSessionInterruptionNotification]) {
seccReason = @"Interruption notification received";
//Check to see if it was a Begin interruption
if ([[notification.userInfo valueForKey:AVAudioSessionInterruptionTypeKey] isEqualToNumber:[NSNumber numberWithInt:AVAudioSessionInterruptionTypeBegan]]) {
seccReason = @"Interruption began";
NSLog(@"Interruption notification name %@ audio pause", notification.name);
dispatch_time_t restartTime = dispatch_time(DISPATCH_TIME_NOW,
0.01 * NSEC_PER_SEC);
dispatch_after(restartTime, dispatch_get_global_queue(0, 0), ^{
AVAudioRecorder *recorder = [[self recorderPool] objectForKey:lastRecID];
if (recorder) {
if(recorder.isRecording) {
[recorder stop];
NSLog(@"Interruption notification name Pauseing recording %@", lastRecID);
} else {
NSLog(@"Interruption notification name Already Paused %@", lastRecID);
}
}else {
NSLog(@"Interruption notification name recording %@ not found", lastRecID);
}
NSLog(@"Interruption notification Pauseing recording status %d",recorder.isRecording);
});
} else if([[notification.userInfo valueForKey:AVAudioSessionInterruptionTypeKey] isEqualToNumber:[NSNumber numberWithInt:AVAudioSessionInterruptionTypeEnded]]){
seccReason = @"Interruption ended!";
NSLog(@"Interruption notification name %@ audio resume", notification.name);
//Start New Recording
dispatch_time_t restartTime = dispatch_time(DISPATCH_TIME_NOW,
0.1 * NSEC_PER_SEC);
dispatch_after(restartTime, dispatch_get_global_queue(0, 0), ^{
AVAudioRecorder *recorder = [[self recorderPool] objectForKey:lastRecID];
NSLog(@"Interruption notification Resumeing recording status %d",recorder.isRecording);
if (recorder) {
if(!recorder.isRecording) {
NSString *filePath = [[self orgFileNames] objectForKey:lastRecID];
NSArray * fileNames =[[self fileNames] objectForKey:lastRecID];
NSString *tmpFileName = [self gnrTempFileName:filePath AndNumber:fileNames.count];
[[[self fileNames] objectForKey:lastRecID] addObject:tmpFileName];
NSURL *url = [NSURL fileURLWithPath:tmpFileName];
NSError *error = nil;
recorder = [[AVAudioRecorder alloc] initWithURL:url settings:recordSetting error:&error];
if (![recorder record]) {
NSLog(@"Interruption notification Error Resumeing recording %@",tempRecorder);
return;
}
[[self recorderPool] setObject:recorder forKey:lastRecID];
NSLog(@"Interruption notification nameResumeing recording %@",lastRecID);
}else {
NSLog(@"Interruption notification Already Recording %d",recorder.isRecording);
}
}else {
NSLog(@"Interruption notification name recording %@ not found",lastRecID);
}
});
}
}
}
您将尝试使用这段代码
-(IBAction)pauseandplay:(id)sender
{
BOOL status= [player isPlaying];
if(status)
{
[pauseplay setImage:[UIImage imageNamed:@"play.png"]];
[player pause];
}
else
{
[pauseplay setImage:[UIImage imageNamed:@"icon-pause.png"]];
[player play];
updateTimer = [NSTimer scheduledTimerWithTimeInterval:.01 target:self selector:@selector(updateCurrentTime) userInfo:player repeats:YES];
}
}