2011-02-23 80 views
5

我在写一个使用AVAudioRecorder类的应用程序。它的工作原理,除了当一个电话进来很棒。我处理这个每周使用AVAudioRecorderDelegate方法如何使用AVAudioRecorder恢复录制?

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

直到中断结束它的伟大工程的苹果的指导方针和我通过调用试图“恢复”的录制再次记录方法(根据文档)。然而,它不会恢复我的录音,而是抛出旧录音,并开始一个全新的录音。我一直无法找到解决这个问题的方法,如果有人想到了这个问题,或者它是一个苹果公司的问题,请告诉我。我真的希望我不必使用AudioQueues来写这个。

感谢

回答

6

尝试看起来与苹果的API中的错误。很有趣....

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

”你描述的行为是一个错误,不幸的是API中没有任何东西可以改变,以便实际附加到原始记录中,中断只会捕获中断后记录的音频。尝试在中断后停止录制,然后创建一个新文件,然后至少不会导致用户丢失任何信息,但结果将是两个单独的文件。当iOS工程师评估修复的关键特性时,由外部开发人员提交的错误至关重要,它很容易重现,但如果你有一个测试应用程序,你可以包括请做,iOS工程师喜欢让应用程序显示bug irectly。 “

-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]; 
    } 
} 
+0

不完全回答中断后恢复。 – NSDeveloper 2015-07-16 07:41:39

0

我的解决办法是:在临时文件

  • 手表AVAudioSessionInterruptionNotificatio

  • 在AVAudioSessionInterruptionTypeBegan

    1. 开始记录 - 停止记录

    2. 在AVAudioSessionInterruptionTypeEnded - 开始新的记录。 。
    3. 当用户停止时 - Marge文件。

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