AVAudioRecorder: невозможно записывать после других приложений записи - PullRequest
1 голос
/ 12 марта 2012

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

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

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

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

Ответы [ 2 ]

3 голосов
/ 12 марта 2012

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

0 голосов
/ 12 марта 2012

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

 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
    }
}
...