3

AVFoundation 框架提供了 AVMutableVideoComposition 类(AVVideoComposition 的可变变体)。看起来您可以将 CoreAnimations 直接渲染到此类的实例以创建视频,但我不知道如何将合成保存到文件或如何使用它,真的。从 UIViewController 调用的以下代码似乎可用于创建合成和动画,但是,我对如何使用合成感到困惑。非常感谢任何帮助或指导。

static AVMutableVideoComposition *videoComposition = nil;
- (void)animationDidStop:(CAAnimation *)animation finished:(BOOL)flag {
 //Do something with videoComposition here... how to save it to a file?
 NSLog(@"videoComposition: %@", videoComposition);
 [videoComposition release]; videoComposition = nil;
}

- (IBAction)createVideoComposition:(id)sender {
 AVVideoCompositionCoreAnimationTool *videoCompositionCoreAnimationTool = [AVVideoCompositionCoreAnimationTool videoCompositionCoreAnimationToolWithPostProcessingAsVideoLayer:self.view.layer inLayer:self.view.layer];
 videoComposition = [[AVMutableVideoComposition videoComposition] retain];
 [videoComposition setRenderSize:CGSizeMake(320.0, 480.0)];
 [videoComposition setRenderScale:1.0];
 [videoComposition setFrameDuration:CMTimeMake(1, 10)];
 [videoComposition setAnimationTool:videoCompositionCoreAnimationTool];
 //add a basic animation to shake the controller's view
 CAKeyframeAnimation *shakeAnimation = [CAKeyframeAnimation animationWithKeyPath:@"position"];
 shakeAnimation.delegate = self;
 shakeAnimation.removedOnCompletion = YES;
 shakeAnimation.duration = 0.5;
 CGMutablePathRef path = CGPathCreateMutable();
 CGFloat midX = self.view.center.x;
 CGFloat midY = self.view.center.y;
 CGPathMoveToPoint(path, nil, midX, midY);
 CGPathAddLineToPoint(path, nil, midX + 10.0, midY);
 CGPathAddLineToPoint(path, nil, midX - 20.0, midY);
 CGPathAddLineToPoint(path, nil, midX + 15.0, midY);
 CGPathAddLineToPoint(path, nil, midX - 5.0, midY);
 CGPathAddLineToPoint(path, nil, midX, midY);
 shakeAnimation.path = path;
 CFRelease(path);
 [self.view.layer addAnimation:shakeAnimation forKey:@"shakeAnimation"];
}

谢谢,乔恩

4

1 回答 1

2

不确定它是否有帮助。

    AVAssetExportSession *session = [[AVAssetExportSession alloc] initWithAsset:composition presetName:AVAssetExportPresetHighestQuality];
    session.videoComposition = videoComposition;
    session.outputURL = outputURL;
    session.outputFileType = AVFileTypeQuickTimeMovie;
    [session exportAsynchronouslyWithCompletionHandler:
         ^(void )
{
        NSLog(@"TADA!")
    }];
于 2010-09-13T06:38:41.610 回答