Приостановка работы приложения AVFoundation, приводящая к повреждению видео - PullRequest
3 голосов
/ 31 марта 2012

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

[movieFileOutput_ startRecordingToOutputFileURL:url recordingDelegate:self];

и я нажал кнопку домой или кнопку питания, чтобы приостановить приложение. Чтобы остановить и сохранить видео перед приостановкой приложения, я реализовал applicationWillResignActive следующим образом.

NSNotificationCenter *notify = [NSNotificationCenter defaultCenter];
[notify addObserver:self selector:@selector(applicationWillResignActive)
     name:UIApplicationWillResignActiveNotification object:NULL];

- (void)applicationWillResignActive{
    isApplicationActive_ = NO;
    if(self.isRecordingVideo == NO){
        return;
    }

    backgroundVideoSavingId_ = [[UIApplication sharedApplication] beginBackgroundTaskWithExpirationHandler:^{
        dispatch_async(dispatch_get_main_queue(), ^{
            if (backgroundVideoSavingId_ != UIBackgroundTaskInvalid) {
                [[UIApplication sharedApplication] endBackgroundTask:backgroundVideoSavingId_];
                backgroundVideoSavingId_ = UIBackgroundTaskInvalid;
            }
        });
    }];

    dispatch_async(dispatch_get_global_queue(DISPATCH_QUEUE_PRIORITY_DEFAULT, 0), ^{

        dispatch_async(dispatch_get_main_queue(), ^{
            [videoElapsedTimer_ invalidate];
            videoElapsedTimeLabel_.text = @"";
            [movieFileOutput_ stopRecording];
        });

        while(backgroundVideoSavingId_ != UIBackgroundTaskInvalid ||
              isApplicationActive_){
            [NSThread sleepForTimeInterval:1];
        }
        //[self playVideoBeepSound];
        backgroundRecordingId_ = UIBackgroundTaskInvalid;
        backgroundVideoSavingId_ = UIBackgroundTaskInvalid;
    });
}

И вывод захвата такой,

/*!
 * did finish recording
 */
- (void) captureOutput:(AVCaptureFileOutput *)captureOutput
didFinishRecordingToOutputFileAtURL:(NSURL *)anOutputFileURL
                    fromConnections:(NSArray *)connections
                              error:(NSError *)error
{    
    if([self.delegate respondsToSelector:@selector(cameraController:didFinishRecordingVideoToOutputFileURL:error:)]){
        currentVideoURL_ = nil;
        [self.delegate cameraController:self didFinishRecordingVideoToOutputFileURL:anOutputFileURL error:error];
    }

    if ([[UIDevice currentDevice] isMultitaskingSupported]) {
        [[UIApplication sharedApplication] endBackgroundTask:backgroundVideoSavingId_];
        backgroundVideoSavingId_ = UIBackgroundTaskInvalid;
    }
}

И проблема в том, что часто я получаю ошибку

-Error Domain=NSOSStatusErrorDomain Code=-12894 "The operation couldn't be completed. (OSStatus error -12894.)"

`` `

Я многое сделал, чтобы понять эту проблему, и я не мог ... Что не так с моим кодом ...?

Любая помощь приветствуется. Спасибо.

...