как возобновить запись после прерывания в iphone?

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

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

- (void)audioRecorderBeginInterruption:(AVAudioRecorder *)recorder

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

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

- (void)audioRecorderEndInterruption:(AVAudioRecorder *)recorder

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


person Jitendra Singh    schedule 10.11.2009    source источник
comment
Пожалуйста, опубликуйте код, который вы используете для запуска/остановки/паузы записи. Вы каждый раз выпускаете объект AVAudioRecorder и создаете новый? Это может объяснить, почему каждый раз, когда вы начинаете запись, используя другой файл.   -  person Massimo Cafaro    schedule 10.11.2009
comment
К вашему сведению, я создал небольшой образец приложения, показывающий, что End Int работает неправильно, и записал разговор с Apple по этому вопросу. Он был с ними в течение › 2 месяцев и ничего не слышал.   -  person ort11    schedule 11.05.2012


Ответы (4)


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

Я переписал код записи, чтобы избежать этой проблемы. Я использовал 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);
person Raj Pawan Gumdal    schedule 16.02.2010
comment
Способен ли этот подход возобновить запись из существующего файла, даже если приложение закрывается и перезагружается? - person memmons; 08.11.2010
comment
Нет, если выходит и перезагружается, но да, он возобновляется, когда приложение выходит на передний план, когда вы соответствующим образом вызываете API-интерфейсы -pause и -resume, прежде чем ваше приложение перейдет в фоновый режим и после того, как оно перейдет на передний план. - person Raj Pawan Gumdal; 10.11.2010
comment
Вы использовали AudioQueues для всего процесса записи? - person Siddharth; 20.01.2012
comment
Не могли бы вы предоставить пример кода о том, как вы это сделали? - person Siddharth; 20.01.2012
comment
Добавлено больше кода о настройке, попробуйте и дайте мне знать, если он работает. - person Raj Pawan Gumdal; 20.01.2012
comment
Кажется, это работает, если вы используете linearpcm в качестве формата, но для aac он не возобновляется. Не уверен, в чем проблема. - person Matt Wolfe; 28.02.2014
comment
К сожалению, у меня больше нет доступа к этому исходному коду, все, что я разместил здесь, — это все, что у меня есть. - person Raj Pawan Gumdal; 03.04.2015
comment
@Raj: можете ли вы сделать небольшой образец и поделиться им для записи резюме? - person jayraj m.g.; 26.11.2015
comment
@Raj Это работает, когда приложение находится в фоновом режиме? - person OhadM; 21.02.2016
comment
Прерывание происходит, когда приложение собирается перейти в фоновый режим. Итак, я делаю паузу, когда приложение вот-вот перейдет в фоновый режим, и возобновляю работу, когда оно открывается. Таким образом, работа / не работа, когда приложение находится в фоновом режиме, здесь не имеет значения. - person Raj Pawan Gumdal; 22.02.2016

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

person lucius    schedule 30.12.2009

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

person Jason B    schedule 01.01.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 и выше.

person Ashish Maheshwari    schedule 15.02.2010