2014-05-15 7 views
0

Je rajoute de la superposition sur ma vidéo en utilisant GPUImage. En avant-première, tout est beau, mais comment puis-je écrire ma vidéo dans un fichier? J'utilise GPUMovieWriter mais je ne peux pas trouver ce fichier et je ne sais même pas si cela fonctionne. Voici mon code:ios save GPUImage video

-(void)setUpCameraWithPosition:(bool)switchToFrontCamera 
{ 
    if(videoCamera != nil) 
    { 
     [videoCamera stopCameraCapture]; 
    } 

    if(switchToFrontCamera) { 
     videoCamera = [[GPUImageVideoCamera alloc] initWithSessionPreset:AVCaptureSessionPreset640x480 cameraPosition:AVCaptureDevicePositionFront]; 
    } 
    else { 
     videoCamera = [[GPUImageVideoCamera alloc] initWithSessionPreset:AVCaptureSessionPreset640x480 cameraPosition:AVCaptureDevicePositionBack]; 
    } 

    videoCamera.outputImageOrientation = UIInterfaceOrientationPortrait; 
    videoCamera.horizontallyMirrorFrontFacingCamera = NO; 
    videoCamera.horizontallyMirrorRearFacingCamera = NO; 

    filter = [GPUImageiOSBlurFilter new]; 
    filter.blurRadiusInPixels = 3.0; 

    GPUImageAlphaBlendFilter *blendFilter = [[GPUImageAlphaBlendFilter alloc] init]; 
    blendFilter.mix = 1.0; 

    NSDate *startTime = [NSDate date]; 

    UILabel *timeLabel = [[UILabel alloc] initWithFrame:CGRectMake(0.0, 0.0, 240.0f, 320.0f)]; 
    timeLabel.font = [UIFont systemFontOfSize:17.0f]; 
    timeLabel.text = @"Time: 0.0 s"; 
    timeLabel.textAlignment = UITextAlignmentCenter; 
    timeLabel.backgroundColor = [UIColor clearColor]; 
    timeLabel.textColor = [UIColor whiteColor]; 

    [videoCamera addTarget:filter]; 
    GPUImageView *filterView = (GPUImageView *)self.preview; 
    filterView.fillMode = kGPUImageFillModePreserveAspectRatioAndFill; 

    NSString *pathToMovie = [NSHomeDirectory() stringByAppendingPathComponent:@"file.mov"]; 
    unlink([pathToMovie UTF8String]); // If a file already exists, AVAssetWriter won't let you record new frames, so delete the old movie 
    NSURL *movieURL = [NSURL fileURLWithPath:pathToMovie]; 
    movieWriter = [[GPUImageMovieWriter alloc] initWithMovieURL:movieURL size:CGSizeMake(480.0, 640.0)]; 
    movieWriter.encodingLiveVideo = YES; 

    [filter addTarget:movieWriter]; 

    uiElementInput = [[GPUImageUIElement alloc] initWithView:timeLabel]; 
    [filter addTarget:blendFilter]; 
    [uiElementInput addTarget:blendFilter]; 

    [blendFilter addTarget:filterView]; 

    __unsafe_unretained GPUImageUIElement *weakUIElementInput = uiElementInput; 

    [filter setFrameProcessingCompletionBlock:^(GPUImageOutput * filter, CMTime frameTime){ 
     timeLabel.text = [NSString stringWithFormat:@"Time: %f s", -[startTime timeIntervalSinceNow]]; 
     [weakUIElementInput update]; 
    }]; 

    [videoCamera startCameraCapture]; 
} 

Comment puis-je écrire mon film sur AssetsLibrary?

Répondre

4

Je suppose par superposition que vous voulez dire que vous voulez écrire la vidéo avec le UIElement comme la superposition?

Dans ce cas, vous voulez être écrire le via votre « blendFilter » et non « filtre »

Retirer cette ligne

[filter addTarget:movieWriter]; 

et ajoutez ceci après l'initialisation du blendFilter

[blendFilter addTarget:movieWriter]; 
[blendFilter addTarget:filterView]; 

Votre initialisation du MovieWriter semble ok, la seule différence que j'ai est que j'utilise « .m4v » comme le format vidéo. C'est le format standard d'Apple.

La vidéo doit enregistrer dans le dossier d'applications à domicile. Utilisez le "Orginizer" ("CMD + SHIFT + 2") dans XCode pour regarder le dossier des applications, la vidéo doit être sous "Documents".