AVVideoCompositionCoreAnimationTool和CALayer在肖像模式?

我正在尝试在iOS 4.3上使用AVMutableComposition,AVMutableVideoComposition和AVVideoCompositionCoreAnimationTool将CALayer烧制成纵向模式video(导出时)。 这一切都在风景。 如果我以纵向捕捉video,AVVideoCompositionCoreAnimationTool将忽略video轨道上的变换。 也就是说,对于纵向模式的video,我将AVMutableCompositionTrack.preferredTransform设置为来自原始资产video轨道的preferredTransform值。 只要我不使用一个AVVideoCompositionCoreAnimationTool,这个工作,和video出来的人像模式。 只要我添加一个AVVideoCompositionCoreAnimationTool和CALayer,然而,文件出现在横向。 (CALayer显示正确,但后面的video位于其旁边,并且文件的宽高比为closures)。 我已经尝试将转换应用于CALayer,并在ACVideoComposition中设置转换。 这些都不会改变生成的文件的方向(它仍然是480×369,而不是360×480)。 有没有办法用AVVideoCompositionCoreAnimationTool渲染肖像模式的video?

首先我build立一个AVMutableComposition和AVMutableVideoComposition

AVMutableComposition *composition = [AVMutableComposition composition]; AVMutableCompositionTrack *compositionVideoTrack = [composition addMutableTrackWithMediaType:AVMediaTypeVideo preferredTrackID:kCMPersistentTrackID_Invalid]; AVURLAsset *videoAsset = [AVURLAsset URLAssetWithURL:url options:nil]; CMTimeRange timeRange = CMTimeRangeMake(kCMTimeZero, [videoAsset duration]); AVAssetTrack *clipVideoTrack = [[videoAsset tracksWithMediaType:AVMediaTypeVideo] objectAtIndex:0]; CGSize videoSize = CGSizeApplyAffineTransform(clipVideoTrack.naturalSize, clipVideoTrack.preferredTransform); videoSize.width = fabs(videoSize.width); videoSize.height = fabs(videoSize.height); CMTime titleDuration = CMTimeMakeWithSeconds(5, 600); CMTimeRange titleRange = CMTimeRangeMake(kCMTimeZero, titleDuration); [compositionVideoTrack insertTimeRange:titleRange ofTrack:nil atTime:kCMTimeZero error:nil]; [compositionVideoTrack insertTimeRange:timeRange ofTrack:clipVideoTrack atTime:titleDuration error:nil]; compositionVideoTrack.preferredTransform = clipVideoTrack.preferredTransform; AVMutableVideoComposition *videoComposition = [AVMutableVideoComposition videoComposition]; AVMutableVideoCompositionInstruction *passThroughInstruction = [AVMutableVideoCompositionInstruction videoCompositionInstruction]; passThroughInstruction.timeRange = CMTimeRangeMake(kCMTimeZero, [composition duration]); AVAssetTrack *videoTrack = [[composition tracksWithMediaType:AVMediaTypeVideo] objectAtIndex:0]; AVMutableVideoCompositionLayerInstruction *passThroughLayer = [AVMutableVideoCompositionLayerInstruction videoCompositionLayerInstructionWithAssetTrack:videoTrack]; passThroughInstruction.layerInstructions = [NSArray arrayWithObject:passThroughLayer]; videoComposition.instructions = [NSArray arrayWithObject:passThroughInstruction]; videoComposition.frameDuration = CMTimeMake(1, 30); videoComposition.renderSize = videoSize; videoComposition.renderScale = 1.0; 

还有一个CALayer标题

 CALayer *animationLayer = [CALayer layer]; animationLayer.bounds = CGRectMake(0, 0, videoSize.width, videoSize.height); CATextLayer *titleLayer = [CATextLayer layer]; titleLayer.string = [effect valueForKey:@"title"]; titleLayer.font = [effect valueForKey:@"font"]; titleLayer.fontSize = 30; titleLayer.alignmentMode = kCAAlignmentCenter; titleLayer.bounds = CGRectMake(0, 0, videoSize.width, videoSize.height / 6); [animationLayer addSublayer:titleLayer]; titleLayer.anchorPoint = CGPointMake(0.5, 0.5); titleLayer.position = CGPointMake(CGRectGetMidX(layer.bounds), CGRectGetMidY(layer.bounds)); CABasicAnimation *fadeAnimation = [CABasicAnimation animationWithKeyPath:@"opacity"]; fadeAnimation.fromValue = [NSNumber numberWithFloat:1.0]; fadeAnimation.toValue = [NSNumber numberWithFloat:0.0]; fadeAnimation.additive = NO; fadeAnimation.removedOnCompletion = NO; fadeAnimation.beginTime = 3.5; fadeAnimation.duration = 1.0; fadeAnimation.fillMode = kCAFillModeBoth; [titleLayer addAnimation:fadeAnimation forKey:nil]; 

最后,我将CALayer添加到AVMutableVideoComposition

 CALayer *parentLayer = [CALayer layer]; CALayer *videoLayer = [CALayer layer]; parentLayer.bounds = CGRectMake(0, 0, videoSize.width, videoSize.height); parentLayer.anchorPoint = CGPointMake(0, 0); parentLayer.position = CGPointMake(0, 0); videoLayer.bounds = CGRectMake(0, 0, videoSize.width, videoSize.height); [parentLayer addSublayer:videoLayer]; videoLayer.anchorPoint = CGPointMake(0.5, 0.5); videoLayer.position = CGPointMake(CGRectGetMidX(parentLayer.bounds), CGRectGetMidY(parentLayer.bounds)); [parentLayer addSublayer:layer]; animationLayer.anchorPoint = CGPointMake(0.5, 0.5); animationLayer.position = CGPointMake(CGRectGetMidX(parentLayer.bounds), CGRectGetMidY(parentLayer.bounds)); videoComposition.animationTool = [AVVideoCompositionCoreAnimationTool videoCompositionCoreAnimationToolWithPostProcessingAsVideoLayer:videoLayer inLayer:parentLayer]; 

并出口!

 AVAssetExportSession *exportSession = [[[AVAssetExportSession alloc] initWithAsset:composition presetName:AVAssetExportPresetMediumQuality] autorelease]; exportSession.videoComposition = videoComposition; NSURL *segmentFileURL = //some local URL exportSession.outputFileType = @"com.apple.quicktime-movie"; exportSession.outputURL = segmentFileURL; [exportSession exportAsynchronouslyWithCompletionHandler:^{ switch ([exportSession status]) { case AVAssetExportSessionStatusFailed: Log(@"Export failed: %@", [exportSession error]); break; case AVAssetExportSessionStatusCancelled: Log(@"Export canceled"); break; case AVAssetExportSessionStatusCompleted: Log(@"Export done"); break; } }]; 

此代码在横向模式下工作,如果我删除线,也在纵向videoComposition.animationTool = [AVVideoCompositionCoreAnimationTool videoCompositionCoreAnimationToolWithPostProcessingAsVideoLayer:videoLayer inLayer:parentLayer];

试试这个,并添加你的其他说明。

 ///turn video 90 degrees AVMutableVideoCompositionLayerInstruction *passThroughLayer = [AVMutableVideoCompositionLayerInstruction videoCompositionLayerInstructionWithAssetTrack:clipVideoTrack]; CGAffineTransform rotationTransform = CGAffineTransformMakeRotation(degreesToRadians(90.0)); CGAffineTransform rotateTranslate = CGAffineTransformTranslate(rotationTransform,320,0); [passThroughLayer setTransform:rotateTranslate atTime:kCMTimeZero]; 

让我知道事情的后续!

MacMike