как продолжить записывать после того, как прерывание произошло в iPhone?

Я работаю над приложением магнитофона, оно работает превосходное.

Но я застреваю с проблемой прерывания. Когда вызов прибывает,

- (void)audioRecorderBeginInterruption:(AVAudioRecorder *)recorder

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

И если пользователь отклоняет требование:

- (void)audioRecorderEndInterruption:(AVAudioRecorder *)recorder

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

9
задан colithium 10 November 2009 в 06:56
поделиться

4 ответа

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

.
0
ответ дан 4 December 2019 в 21:50
поделиться

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

2
ответ дан 4 December 2019 в 21:50
поделиться

Чтобы обработать прерывание, вы должны использовать методы 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
ответ дан 4 December 2019 в 21:50
поделиться

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

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

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

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

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

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

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

РЕДАКТИРОВАТЬ:

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

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);
7
ответ дан 4 December 2019 в 21:50
поделиться
Другие вопросы по тегам:

Похожие вопросы: