2017-11-14 6 views
0

アニメーションの各フレームをCALayerにキャプチャして、mp4ムービーファイルを生成します。CAAnimationのキャプチャ方法

私は以下のコードを書いています。

framesframeTimeは、1/60秒であり、animationLayerが既にUIImageViewに追加されている、アニメーションの総フレーム数です。

for i in 0...(frames - 1) { 

    //add the animation on specified frame to the CALayer 
    animationGroup.speed = 0 
    animationGroup.timeOffset = frameTime * i 
    animationLayer.add(animationGroup, forKey: "morph") 

    //capture the frame of the animation. 
    UIGraphicsBeginImageContextWithOptions(drawView.bounds.size, true, 0.0) 
    drawView.drawHierarchy(in: drawView.bounds, afterScreenUpdates: true) 
    uiImage = UIGraphicsGetImageFromCurrentImageContext() 
    UIGraphicsEndImageContext() 

    uiImage = globalFunc.resizeUIImage(uiImage, scale, 400) 
    cgImage = uiImage.cgImage! 

    //add the captured image to movie file. 
    movieCreator.create(image: cgImage) 

    animationLayer.removeAnimation(forKey: "moprh") 
} 

このコードは機能しません。

各フレームの画像は表示されず、動画ファイルが作成されますがアニメーションはありません。

上記のコードでDispatchQueue.main.asycCAtransition.begin(), .setCompletionBlock, .commit()を試しましたが、機能しませんでした。

私は何をしたいのですか?

+0

アニメーションは使用しないでください。その代わりに、タイマーループ(単純なforループ!だけでなく)でアニメーションプロパティを変更してください。レイヤのコンテンツをイメージコンテキストに描画するには、['render(in:)'](https://developer.apple.com/documentation/quartzcore/calayer/1410909-render)を使用します。 – clemens

+0

@macmoonshineあなたの答えをありがとう!しかし私はあなたの方法が私のプロジェクトのためのスイートではないことを恐れています。私のanimationGroupはCAKeyframeAnimationを使用しているので、アニメーション化するには複雑すぎます。 とにかく、ありがとう!ところで、単純なforループがうまくいかないのはなぜですか? –

+0

CAAnimationsはスクリーンプレゼンテーション用に最適化されています。したがって、フレームレートが不均一です。残念ながら、間にレイヤーをレンダリングすると、フレームレートが悪化します。 – clemens

答えて

0

イメージのコンテキストにビュー階層を描画しないでください。代わりに、このようにプレゼンテーション層をレンダリングする必要があります。

if let presentationLayer = drawView.layer.presentation() { 
    presentationLayer.render(in: context) 
} 

プレゼンテーション層は、現在画面上に描画され、レイヤの内容を表しています。

+0

ありがとうあなたのコードを試しましたが、うまくいきませんでした。 アニメーションの各フレームが画面に表示されず、生成されたムービーにアニメーションがありません。 –

+0

これは私が私のコメントを説明した問題とまったく同じように聞こえる。 – clemens

+0

Hmm ...アニメーションをキャプチャするとき、アニメーションを3回遅くし、20fpsで 'CADisplayLink'をキックして各フレームのイメージをキャプチャします。 方法は私のiPhone6上でうまく動作しますが、私はそれがスマートな方法ではないと思います。 私のアプリがより速いデバイス上で動作するときに、ムービーをより速く生成したいのですが、その理由はここにあります。 とにかく、ありがとうございました! 私のアプリをリリースすると、私は更新のための他の方法を探しているでしょう。 –

関連する問題