2013-12-16 1 views
4

Я искал ответ в течение 2 дней, но я не могу показаться, чтобы получить это право ...Остановка записи камеры и сохранить файл при входе фона

У меня есть пример приложение, которое записывает аудио и видео с устройства с использованием AVCaptureSession и AVCaptureMovieFileOutput.

Когда я начала записи я называю:

[self.movieFileOutput startRecordingToOutputFileURL:outputURL recordingDelegate:self]; 

И начинает запись в файл. Если я еще раз нажать на кнопку останавливает запись

[self.movieFileOutput stopRecording]; 

Все работает хорошо, но когда я вхожу фон (входящий вызов или HOME нажмите) Я получаю сообщение об ошибке в методе делегата: didFinishRecordingToOutputFileAtURL

Мое желаемое действие должно сохранять или заполнять файл при вводе фона. Если я вызову stopRecording на «applicationDidEnterBackground», он войдет в фон перед вызовом applicationDidEnterBackground. При входе в активное состояние он вызывается .... и генерирует ошибку и оставляет поврежденный файл фильма ...

Кажется, у него нет достаточно времени для сохранения файла.

Что мне здесь не хватает?

Это моя ошибка

Error Domain=AVFoundationErrorDomain Code=-11818 "Recording Stopped" UserInfo=0x17594e20 {NSLocalizedRecoverySuggestion=Stop any other actions using the recording device and try again., NSUnderlyingError=0x175d3500 "The operation couldn’t be completed. (OSStatus error -16133.)", NSLocalizedDescription=Recording Stopped}

AVErrorSessionWasInterrupted = -11818 
+0

Я также попробовал приложение Apple AVDemo, и он также дает ту же ошибку. Кажется, что ошибка все равно. Разница в том, что в коде Яблоков у них есть время для выполнения расширенного кода с использованием UIBackgroundTaskIdentifier – Michiel

ответ

3

NSOperationQueue является рекомендуемым способом для выполнения многопоточных задач, чтобы избежать блокировки основного потока. Фоновый поток используется для задач, которые вы хотите выполнять, пока ваше приложение неактивно, например, показания GPS или потоковое аудио.

Если приложение работает на переднем плане, вам не нужна фоновая нить.

Для простых задач, вы можете добавить операцию в очередь с использованием блока:

NSOperationQueue* operationQueue = [[NSOperationQueue alloc] init]; 
[operationQueue addOperationWithBlock:^{ 
    // Perform long-running tasks without blocking main thread 
}]; 

Более подробную информацию о NSOperationQueue и how to use it.

- (void)applicationWillResignActive:(UIApplication *)application { 
    bgTask = [application beginBackgroundTaskWithExpirationHandler:^{ 

     // Wait until the pending operations finish 
     [operationQueue waitUntilAllOperationsAreFinished]; 

     [application endBackgroundTask: bgTask]; 
     bgTask = UIBackgroundTaskInvalid; 
    }]; 
} 
+0

. Это путь для меня. Я реализовал этот фрагмент кода из примера кода Яблока, но я сделал глупую ошибку ... расширение файла изменилось каждый раз, когда фильм был сохранен и для него выглядел искаженный -1 для меня ...... – Michiel

1

Вы можете обрабатывать сохранение в applicationWillResignActive:, а затем вы можете продолжить процесс в фоновом режиме.

+0

Это не работает, так или иначе, я должен убедиться, что сеанс не прерывается при переходе на задний план. – Michiel

+0

, тогда вам нужно сделать еще один поток .. и вам придется обрабатывать этот поток при его вводе в фоновом режиме. –

+0

Check, applicationWillResignActive не дает мне достаточно времени для обработки. В Melih Büyükbayram это делается! – Michiel