Video Negro CAAnimación y AVFundación AVAssetExportSession

Soy un novato en todo el circuito de edición de video AVFoundation.

Mi aplicación de prueba actual es una aplicación de dos pantallas, la primera pantalla hace una grabación de video AVFoundation (1.mov), y la segunda pantalla le permite ver el video y poner algunos créditos de título en él con un CAAnimation.

El archivo de video 1.mov se graba en formato vertical guardado en el disco y luego se ejecuta a través de esta rutina que debería darme un título en la parte superior del video. Sin embargo, todo lo que recibo es un video en negro de las dimensiones correctas, la duración del tiempo con el CATextLayer en él.

Estoy bastante seguro de que me falta algo básico. Tengo un código en el lugar que debe manejar toda la rotación del retrato del paisaje.

-(IBAction)ComposeMovie:(id)sender {
    NSLog (@"ComposeMovie");

    CALayer *aLayer = [CALayer layer];
    aLayer.Frame = CGRectMake(0, 0, videoSize.height, videoSize.width); 
    CALayer *bLayer = [CALayer layer]; 

    NSLog(@"Create the title"); 
    CATextLayer *titleLayer = [CATextLayer layer]; 
    titleLayer.string = @"SUDO make me a sandwich"; 
    titleLayer.font = [UIFont boldSystemFontOfSize:18].fontName; 
    titleLayer.backgroundColor = [UIColor whiteColor].CGColor; 
    titleLayer.foregroundColor = [UIColor blackColor].CGColor; 
    titleLayer.fontSize = 24; 
    titleLayer.alignmentMode = kCAAlignmentRight; 
    titleLayer.bounds = CGRectMake(videoSize.width, videoSize.height /6, 300, 32); 
    [aLayer addSublayer:titleLayer]; 

    NSURL *url = [NSURL fileURLWithPath:getCaptureMoviePath()]; //Hard coded path to the 1.mov file in the documents directory
    AVURLAsset *asset = [AVURLAsset URLAssetWithURL:url options:nil];

    AVMutableComposition *cmp = [[AVMutableComposition alloc] init] ;  
    AVMutableCompositionTrack *trackA = [cmp addMutableTrackWithMediaType:AVMediaTypeVideo preferredTrackID:kCMPersistentTrackID_Invalid];
    NSError *error = nil ;
    AVAssetTrack *sourceVideoTrack = [[asset tracksWithMediaType:AVMediaTypeVideo] objectAtIndex:0];
    [trackA insertTimeRange:CMTimeRangeMake(kCMTimeZero, [asset duration]) ofTrack:sourceVideoTrack atTime:kCMTimeZero error:&error] ;
    AVMutableVideoComposition *animComp = [[AVMutableVideoComposition videoComposition] retain];
    animComp.renderSize = CGSizeMake(videoSize.height, videoSize.width); 
    animComp.frameDuration = CMTimeMake(1,30);

    AVMutableVideoCompositionInstruction *instruction = [AVMutableVideoCompositionInstruction videoCompositionInstruction]; 
    instruction.timeRange = CMTimeRangeMake(kCMTimeZero, CMTimeMakeWithSeconds(60, 30) ); 

    AVMutableVideoCompositionLayerInstruction* rotator = [AVMutableVideoCompositionLayerInstruction videoCompositionLayerInstructionWithAssetTrack:[[asset tracksWithMediaType:AVMediaTypeVideo] objectAtIndex:0]];
    CGAffineTransform translateToCenter = CGAffineTransformMakeTranslation( 0,-320);    
    CGAffineTransform rotateBy90Degrees = CGAffineTransformMakeRotation( M_PI_2);
    CGAffineTransform shrinkWidth = CGAffineTransformMakeScale(0.66, 1); // needed because Apple does a "stretch" by default - really, we should find and undo apple's stretch - I suspect it'll be a CALayer defaultTransform, or UIView property causing this
    CGAffineTransform finalTransform = CGAffineTransformConcat( shrinkWidth, CGAffineTransformConcat(translateToCenter, rotateBy90Degrees) );
    [rotator setTransform:finalTransform atTime:kCMTimeZero];

    instruction.layerInstructions = [NSArray arrayWithObject: rotator];
    animComp.instructions = [NSArray arrayWithObject: instruction];


    NSLog(@"Creating Animation"); 
    //animComp.animationTool = [AVVideoCompositionCoreAnimationTool videoCompositionCoreAnimationToolWithAdditionalLayer: asTrackID:1];
    animComp.animationTool = [AVVideoCompositionCoreAnimationTool videoCompositionCoreAnimationToolWithAdditionalLayer:aLayer asTrackID:2];
    animComp.animationTool = [AVVideoCompositionCoreAnimationTool videoCompositionCoreAnimationToolWithAdditionalLayer:bLayer asTrackID:3]; 
    //AVMutableVideoCompositionInstruction *instruction = [AVMutableVideoCompositionInstruction videoCompositionInstruction];
    instruction.timeRange = CMTimeRangeMake(kCMTimeZero, [asset duration]);
    AVMutableVideoCompositionLayerInstruction* layerInstruction = [AVMutableVideoCompositionLayerInstruction videoCompositionLayerInstructionWithAssetTrack:trackA];
    //[layerInstruction setTrackID:1]; 

    /*CMTime startTime = CMTimeMake(3,1); 
    CMTime stopTime = CMTimeMake(5,1); 
    CMTimeRange exportTimeRange = CMTimeRangeFromTimeToTime(startTime, stopTime); 
    */ 

    //AVMutableVideoCompositionLayerInstruction *passThroughLayer = AVMutableVideoCompositionLayerInstruction videoCompositionLayerInstructionWithAssetTrack:videoTrack];
    CGAffineTransform rotationTransform = CGAffineTransformMakeRotation(degreesToRadians(90.0));
    CGAffineTransform rotateTranslate = CGAffineTransformTranslate(rotationTransform,320,0);
    [layerInstruction setTransform:rotateTranslate atTime:kCMTimeZero];

    [layerInstruction setOpacity:1.0 atTime:kCMTimeZero ];
    instruction.layerInstructions = [NSArray arrayWithObject:layerInstruction];
    animComp.instructions = [NSArray arrayWithObject:instruction];

    CALayer *parentLayer = [CALayer layer]; 
    CALayer *videoLayer = [CALayer layer]; 
    parentLayer.frame = CGRectMake(0,0, videoSize.width, videoSize.height); 
    videoLayer.frame = CGRectMake(0,0, videoSize.width, videoSize.height); 
    [parentLayer addSublayer:aLayer]; 
    [parentLayer addSublayer:bLayer];
    [parentLayer addSublayer:videoLayer]; 

    animComp.animationTool = [AVVideoCompositionCoreAnimationTool videoCompositionCoreAnimationToolWithPostProcessingAsVideoLayer:videoLayer inLayer:parentLayer];

    NSLog(@"Creating File"); 
        NSArray *docPaths = NSSearchPathForDirectoriesInDomains(NSDocumentDirectory, NSUserDomainMask, YES);
        NSString *tempPath = [docPaths objectAtIndex:0];
        NSLog(@"Temp Path: %@",tempPath);

        NSString *fileName = [NSString stringWithFormat:@"%@/render.MOV",tempPath];
        NSFileManager *fileManager = [NSFileManager defaultManager] ;
        if([fileManager fileExistsAtPath:fileName ]){
            NSError *ferror = nil ;
            BOOL success = [fileManager removeItemAtPath:fileName error:&ferror];
        }

        NSURL *exportURL = [NSURL fileURLWithPath:fileName];

        AVAssetExportSession *exporter = [[AVAssetExportSession alloc] initWithAsset:cmp presetName:AVAssetExportPresetHighestQuality]  ;
        exporter.outputURL = exportURL;
        exporter.videoComposition = animComp ;
        exporter.outputFileType= AVFileTypeQuickTimeMovie ;
        [exporter exportAsynchronouslyWithCompletionHandler:^(void){
            switch (exporter.status) {
                case AVAssetExportSessionStatusFailed:{
                    NSLog(@"Fail");
                    break;
                }
                case AVAssetExportSessionStatusCompleted:{
                    NSLog(@"Success");
                    break;
                }

                default:
                    break;
            }
        }];



    NSLog(@"End ComposeMovie"); 


}

Respuestas a la pregunta(2)

Su respuesta a la pregunta