Schwarz Video CAAnimation und AVFoundation AVAssetExportSession

Ich bin ein relativer Neuling in der gesamten AVFoundation-Videobearbeitungsschaltung.

Meine aktuelle Test-App ist eine Anwendung mit zwei Bildschirmen, auf dem ersten Bildschirm wird eine AVFoundation-Videoaufnahme (1.mov) erstellt. Auf dem zweiten Bildschirm können Sie das Video anzeigen und mit einer CAAnimation Titelguthaben hinzufügen.

Die 1.mov-Videodatei wird im Hochformat auf der Festplatte gespeichert und dann durch diese Routine ausgeführt, die mir einen Titel über dem Video geben sollte. Ich erhalte jedoch nur ein schwarzes Video mit den richtigen Abmessungen und der richtigen Zeitdauer mit dem CATextLayer.

Ich bin mir ziemlich sicher, dass mir etwas Grundlegendes fehlt. Ich habe Code an Ort und Stelle, der die gesamte Querformat-Hochformat-Rotation behandeln sollte.

-(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"); 


}

Antworten auf die Frage(2)

Ihre Antwort auf die Frage