Я работаю над приложением магнитофона, оно работает превосходное.
Но я застреваю с проблемой прерывания. Когда вызов прибывает,
- (void)audioRecorderBeginInterruption:(AVAudioRecorder *)recorder
тогда этот метод называют, и запись приостанавливается.
И если пользователь отклоняет требование:
- (void)audioRecorderEndInterruption:(AVAudioRecorder *)recorder
Тогда здесь я хочу возобновить запись от точки, где она была прервана. Но когда я называю рекордный метод снова, запись запускается с нового файла.
Я пытался сделать это некоторое время назад и пришел к выводу, что это не может быть сделано правильно, операционная система сама не позволит вам сделать это. Может быть, в версии 3.1.2 это изменилось, но когда я попытался в версии 3.0 это просто не сработало.
.Вероятно, операционная система останавливает AVAudioRecorder во время прерывания. Вы можете либо представить пользователю два или более файла в виде одной записи, либо использовать AudioQueue для написания кода для обработки прерываний (а также сохранения аудиоданных в файл).
Чтобы обработать прерывание, вы должны использовать методы 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 и выше.
Проблема решена!
Я переписал код записи, чтобы избежать этой проблемы. Я использовал 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);