2

複数のスプライトシートと期間を取る FrameChangeAnimation クラスがあります。したがって、それぞれ 16 個の文字ブロックを含む 3 つのスプライトシートがあり、持続時間として「3」秒を指定するとします。FrameChangeAnimation インスタンスが CALayer として返されたら、それを画面にアタッチするとスムーズに再生されます [16 フレーム/秒]

このアニメーションをビデオとしてエクスポートしたいと思います。問題は、今回 CABasicAnimation を持続時間でアタッチするときです。「デュレーション」パラメーターが機能せず、すべてのフレームが 1 秒で再生されます。

    GTAnimation *an = [[GTAnimation alloc] initWithFrame:CGRectMake(0, 0, videoSize.width, videoSize.height) withFileName:@"Host_Angry_" withSeconds:3.5];

    CALayer *animationLayer = [CALayer layer];
    animationLayer.bounds = CGRectMake(0, 0, videoSize.width, videoSize.height);
    [animationLayer addSublayer:an.animLayer];

    CABasicAnimation *fadeAnimation = [CABasicAnimation animationWithKeyPath:@"currentFrame"];
    fadeAnimation.fromValue = [NSNumber numberWithFloat:1.0];
    fadeAnimation.toValue = [NSNumber numberWithFloat:45.0];
    fadeAnimation.additive = NO;
    fadeAnimation.removedOnCompletion = NO;
    fadeAnimation.beginTime = 0.0;
    fadeAnimation.duration = 3.5;
    fadeAnimation.repeatCount = HUGE_VAL;
    fadeAnimation.fillMode = kCAFillModeBoth;
    [an.animLayer addAnimation:fadeAnimation forKey:@"currentFrame"];

    CALayer *parentLayer = [CALayer layer];
    CALayer *videoLayer = [CALayer layer];

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

2 に答える 2

4

AVVideoCompositionCoreAnimationTool クラスのドキュメントによると、

「アニメーションはリアルタイムではなく、ビデオのタイムラインで解釈されるため、次のことを行う必要があります。

アニメーションの beginTime プロパティを 0 ではなく 1e-100 に設定します (CoreAnimation はこれを CACurrentMediaTime に置き換えます)。

于 2012-06-16T23:47:51.077 に答える