Как возобновить запись с помощью AVAudioRecorder? - PullRequest
7 голосов
/ 23 февраля 2011

Я пишу приложение, которое использует класс AVAudioRecorder. Он прекрасно работает, за исключением случаев, когда поступает телефонный звонок. Я занимаюсь этим в соответствии с рекомендациями Apple по использованию методов AVAudioRecorderDelegate

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

Он прекрасно работает, пока не закончится прерывание, и я пытаюсь «возобновить» запись, снова вызвав метод записи (согласно документации). Однако он не возобновляет мою запись, а вместо этого выбрасывает старую и запускает на ее место совершенно новую. Я не смог найти решение этой проблемы, если кто-то понял это, или если это ошибка с яблоком AVAudioRecorder, пожалуйста, дайте мне знать. Я действительно надеюсь, что мне не нужно писать это, используя AudioQueues.

спасибо

Ответы [ 3 ]

8 голосов
/ 25 февраля 2011

Похоже, это ошибка с API Apple. Большое удовольствие ....

Это был ответ, который мы получили от службы поддержки.

"Поведение, которое вы описали, является ошибкой, и, к сожалению, в API нет ничего, что вы могли бы изменить, чтобы фактически добавить к исходной записи. Прерывание приводит к захвату только звука, записанного после прерывания. Вы можете попробовать и остановите запись после прерывания, а затем создайте новый файл, после которого, по крайней мере, пользователь не потеряет какую-либо информацию, но в результате получатся два отдельных файла.

Пожалуйста, отправьте отчет об ошибке для этой проблемы, так как ошибки, поданные внешними разработчиками, имеют решающее значение, когда разработка iOS оценивает критические функции исправлений, которые необходимо устранить. Это легко воспроизводимо, но если у вас есть тестовое приложение, которое вы можете включить, сделайте, например, iOS-разработку, чтобы иметь приложения, которые показывают ошибку напрямую. «

1 голос
/ 06 марта 2018

Мое решение было:

  1. Начать запись во временном файле

  2. Следите за AVAudioSessionInterruptionNotificatio

  3. На AVAudioSessionInterruptionTypeBegan - остановить запись.
  4. On AVAudioSessionInterruptionTypeEnded - начать новую запись.
  5. Когда пользователь останавливается - Marge файлы.

Полный код

     [[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);
            }
        });
      }
     } 
    }
0 голосов
/ 23 февраля 2011

Вы попробуете, используя этот кусок кода

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