AVAudioRecorder: не может записывать после других приложений для записи

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

После отладки я обнаружил, что: [record prepareToRecord] возвращает TRUE (этот метод для создания файла записи - например, файл .caf) [record record] всегда возвращает FALSE (это проблема)

Я не знаю, почему [запись рекордера] возвращает FALSE. Кто-нибудь видел эту проблему раньше и может сказать мне, как это исправить?

Большое Вам спасибо.


person haisergeant    schedule 12.03.2012    source источник


Ответы (2)


Похоже, вам нужно активировать AVAudioSession, когда ваше приложение станет активным.

person meggar    schedule 12.03.2012
comment
Не могли бы вы объяснить, как это сделать? AudioSessionSetActive(true); не помогает!! - person saiy2k; 09.08.2013

Как только вы потеряете запись, вы должны снова НАЧАТЬ аудиозапись, и вы ДОЛЖНЫ быть на переднем плане, чтобы сделать это. Вы можете захватывать события прерывания звука для прерываний и прерываний. НО в настоящее время в этом есть ошибки, и вы не понимаете закончившихся событий.

 AVCaptureSession            *captureSession;
 .......
 [[NSNotificationCenter defaultCenter] addObserver:self selector:@selector(audioInterruptionEnded) name:AVCaptureSessionInterruptionEndedNotification object:captureSession];
 [captureSession addObserver: self forKeyPath:@"running" options:0x3 context:nil];
 [captureSession addObserver: self forKeyPath:@"interrupted" options:0x3 context:nil];

Есть два способа захвата звука. Использование сеанса AVCapture более высокого уровня или AudioQueue более низкого уровня, но оба они ограничены первым абзацем.

- (void) observeValueForKeyPath:(NSString *)keyPath ofObject:(id)object change:(NSDictionary *)change context:(void *)context 
{
    if ([keyPath isEqualToString:@"interrupted"]) 
    { 
          // try restart here if in foreground
          // post local notification if in background to bring to foreground and then restart
    }
}
person ort11    schedule 12.03.2012