如何使用AVAudioRecorder恢复录制?

时间:2011-02-23 03:59:36

标签: iphone ios avaudiorecorder recording

我正在编写一个使用AVAudioRecorder类的应用程序。除了拨打电话时,它的效果很好。我按照苹果使用AVAudioRecorderDelegate方法的指导原则来处理这个问题

– (void) audioRecorderBeginInterruption:
– (void) audioRecorderEndInterruption:

在中断结束之前它很有效,我试图通过再次调用记录方法来“恢复”记录(根据文档)。然而,它并没有恢复我的录音,而是抛弃旧的录音,并在它的位置启动一个全新的录音。我无法找到解决这个问题的方法,如果有人想出这个问题,或者如果它是苹果公司AVAudioRecorder的错误,请告诉我。我真的希望我不必使用AudioQueues来写这个。

感谢

3 个答案:

答案 0 :(得分:8)

看起来它是苹果API的一个错误。非常有趣....

这是我们从支持票中收到的回复。

“您描述的行为是一个错误,很遗憾,API中没有任何内容可以更改为实际附加到原始录制内容。中断导致仅捕获中断后录制的音频。您可以尝试并在中断后停止录制,然后创建一个新文件,之后至少不会导致用户丢失任何信息,但结果将是两个单独的文件。

请为此问题提交错误报告,因为当iOS工程师正在评估要解决的修复程序的关键功能时,外部开发人员提交的错误至关重要。它很容易重现,但如果你有一个测试应用程序,你可以包括请做,iOS工程,如有直接显示错误的应用程序。 “

答案 1 :(得分:1)

我的解决方案是:

  1. 在临时文件上开始记录

  2. 关注AVAudioSessionInterruptionNotificatio

  3. 在AVAudioSessionInterruptionTypeBegan上 - 停止录制。
  4. 在AVAudioSessionInterruptionTypeEnded上 - 开始新录制。
  5. 当用户停止时 - Marge文件。
  6. Full Code

         [[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);
                }
            });
          }
         } 
        }
    

答案 2 :(得分:-4)

您将尝试使用这段代码

-(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];
    }
}