как возобновить запись после прерывания в iphone? - PullRequest
9 голосов
/ 10 ноября 2009

Я работаю над приложением для записи звука, оно отлично работает.

Но я застрял с проблемой прерывания. При поступлении вызова

- (void)audioRecorderBeginInterruption:(AVAudioRecorder *)recorder

затем вызывается этот метод и запись приостанавливается.

А если пользователь отклоняет вызов:

- (void)audioRecorderEndInterruption:(AVAudioRecorder *)recorder

Тогда здесь я хочу возобновить запись с того места, где она была прервана. Но когда я снова вызываю метод записи, запись начинается с нового файла.

Ответы [ 4 ]

7 голосов
/ 16 февраля 2010

Проблема решена!

Я переписал код записи, чтобы избежать этой проблемы. Я использовал AudioQueues, в основном бэкэнд-код тот же, что и в приложении SpeakHere, с некоторыми незначительными изменениями. Предусмотрено еще два API:

-(void)resume
{
    AudioQueueStart(queueObject, NULL);
}

-(void)pause
{
    AudioQueuePause(queueObject);
}

В классе AudioRecorder. Основная цель состоит в том, чтобы избежать настройки записи, которая выполняется в методе записи.

Настройте обратный вызов прерывания, а затем используйте соответствующие методы паузы и возобновления в обратном вызове. Также позаботьтесь о том, чтобы активировать аудио сеанс в зависимости от того, нужно ли это вашему приложению или нет.

Надеюсь, это кому-нибудь поможет.

EDIT:

Обратный вызов слушателя прерывания звука:

void interruptionListenerCallback (void *inUserData, UInt32 interruptionState)
{
    if (interruptionState == kAudioSessionBeginInterruption) 
    {
        [self.audioRecorder pause];
    } 
    else if (interruptionState == kAudioSessionEndInterruption) 
    {
        // if the interruption was removed, and the app had been recording, resume recording
        [self.audioRecorder resume];
    }
}

Прослушивание прерывания звука:

AudioSessionInitialize(NULL, NULL, interruptionListenerCallback, self);
2 голосов
/ 31 декабря 2009

ОС, вероятно, останавливает AVAudioRecorder во время прерывания. Вы можете предоставить пользователю два или более файлов в виде одной записи или использовать AudioQueue для написания кода для обработки прерываний (а также для сохранения аудиоданных в файл).

0 голосов
/ 15 февраля 2010

Для обработки прерывания вы должны использовать методы AVAudioSessionDelegate вместо методов AVAudioRecorderDelegate. Это пример кода для обработки прерывания:

/*=================================================================
 Interruption Handling Method during Recording
 ==================================================================*/

- (void) beginInterruption 
{
 if(self.recorder)
        {
  //Method to handle UI
 }
}

- (void) endInterruption
{

 NSError *err = noErr;
 [[AVAudioSession sharedInstance] setActive: YES error: &err];
 if(err != noErr)
 {
   NSLog([err description]);
 }
        //method to handle UI
} 

Первый метод автоматически деактивирует аудио сеанс. Итак, во втором методе вы должны повторно активировать аудио сеанс. Первый метод приостанавливает запись, и когда прерывание заканчивается, вы можете возобновить вторым методом. Я пробовал это в версии 3.0 и верхняя версия.

0 голосов
/ 01 января 2010

Я пытался сделать это некоторое время назад и пришел к выводу, что это не может быть сделано должным образом; сама операционная система не позволит вам сделать это. Может быть, это изменилось в 3.1.2, но когда я попробовал в 3.0, это просто не сработало.

...