Ben K
Ben K

Reputation: 36

GPUImage saving video in background issue

I'm having an issue with saving video from a GPUImage videoCamera to the Camera Roll when my app goes into the background. The file is only saved to the camera roll when the app returns to the foreground / is restarted. I'm no doubt making a beginners code error , if anyone can point it out that would be appreciated.

 - (void)applicationDidEnterBackground:(UIApplication *)application {

if (isRecording){
    [self stopRecording];
};
if (self.isViewLoaded && self.view.window){
    [videoCamera stopCameraCapture];
};
runSynchronouslyOnVideoProcessingQueue(^{
    glFinish();
});
NSLog(@"applicationDidEnterBackground");

and then

-(void)stopRecording {
[filterBlend removeTarget:movieWriter];
videoCamera.audioEncodingTarget = nil;
[movieWriter finishRecording];
NSString *path = [NSTemporaryDirectory() stringByAppendingPathComponent:@"file.mov"];
ALAssetsLibrary *al = [[ALAssetsLibrary alloc] init];
[al writeVideoAtPathToSavedPhotosAlbum:[NSURL fileURLWithPath:path] completionBlock:^(NSURL *assetURL, NSError *error) {
    if (error) {
        NSLog(@"Error %@", error);
    } else {
        NSLog(@"Success");
    }

}];
isRecording = NO;
NSLog(@"Stop recording");

Upvotes: 0

Views: 469

Answers (1)

Ben K
Ben K

Reputation: 36

It was exactly as Brad pointed out in his, as usual, insightful comment, the -writeVideoAtPathToSavedPhotosAlbum:completionBlock: wasn't completing till after the app returned to the foreground, I solved it by adding

self.backgroundTask = [[UIApplication sharedApplication] beginBackgroundTaskWithExpirationHandler:^{
    NSLog(@"Background handler called. Not running background tasks anymore.");
    [[UIApplication sharedApplication] endBackgroundTask:self.backgroundTask];
    self.backgroundTask = UIBackgroundTaskInvalid;
}];

and

@property (nonatomic) UIBackgroundTaskIdentifier backgroundTask;

Found this solution at http://www.raywenderlich.com/29948/backgrounding-for-ios

Upvotes: 1

Related Questions