これは驚くべきことではありません。AVPlayerLayer
フレームワーク内に存在しないQuartzCore
か、CA
クラス接頭辞がないため、特別なレイヤークラスです。また、ビデオ フレームをディスプレイにレンダリングするように高度に最適化されています。AVPlayerLayer
UIKit を介して間接的に、または Core Animation を介して直接的にアニメーションを に追加しようとすると、奇妙な動作が発生します。
おそらく、あらゆる種類のアニメーションを適用する唯一の方法AVPlayerLayer
は、ホスト ビューのスナップショットを作成するか、レイヤーの内容をグラフィックス コンテキストに直接レンダリングすることです。AVPlayerLayer
ただし、 Core Animation がレンダリングできるバッキング ストアが含まれていない可能性があるため、後者が機能しなくても驚かないでしょう。
編集:これは、この問題のプレイグラウンド ソリューションですが、コア アニメーションだけではなく、UIKit の使用に依存しています。デバイスまたはシミュレーターでテストしていませんが、これは機能しているようです:
import UIKit
import AVFoundation
import PlaygroundSupport
let rootView = UIView(frame: CGRect(x: 0.0, y: 0.0, width: 600.0, height: 400.0))
rootView.backgroundColor = .white
let playerLayerView = UIView()
playerLayerView.frame.size = CGSize(width: 480.0, height: 270.0)
playerLayerView.center = CGPoint(x: rootView.bounds.midX, y: rootView.bounds.midY)
guard let videoUrl = Bundle.main.url(
forResource: "HEVC_3_iPhone",
withExtension: "m4v")
else { fatalError() }
let player = AVPlayer(url: videoUrl)
player.play()
let playerLayer = AVPlayerLayer(player: player)
playerLayer.frame = playerLayerView.bounds
playerLayerView.layer.addSublayer(playerLayer)
rootView.addSubview(playerLayerView)
UIView.animate(
withDuration: 1.0,
delay: 0.0,
options: [.autoreverse, .repeat],
animations: {
playerLayerView.transform = CGAffineTransform(scaleX: 1.2, y: 1.2)
},
completion: nil
)
PlaygroundPage.current.liveView = rootView
外観は次のとおりです。

私の理解が正しければ、「問題」は、パイプラインの必要性ほど問題ではありませんAVPlayerLayer
が、標準の UIKit レンダリングおよび合成パイプラインの外にあることです。AVFoundation は、UIKit のレンダリング ループによって制限されない画面への直接描画アクセスを必要とするため、 のような他の特別なレイヤ クラスとともにCAMetalLayer
、は別のプロセスでレンダリングされます。AVPlayerLayer
そのため、アニメーションをレイヤーに直接アタッチしようとしても機能しません。
ただし、そのレイヤーを に配置するとUIView
、Core Animation をAVPlayerLayer
ビュー階層に合成できます。つまり、ビューに対するジオメトリの変更は、ビデオ プレーヤー レイヤーの表示に影響を与えます。AVFoundation は依然としてビデオ フレームを希望どおりにレンダリングする可能性が高いですが、必要に応じて合成する Core Animation のテクスチャを提供します。
以前は個別にレンダリングされていたビデオを UIKit のレンダリング ループに強制しているため、これにより微妙なプレーヤーのタイミング ジッターが発生する可能性があります。一般に、これらの特別なレイヤーを同期するのは難しいです。なぜなら、コア アニメーションは、さまざまなプロセスがレイヤーにレンダリングされたビットマップを提供し終えるのを必然的に待たなければならず、すべてを 1 回の画面更新に合成できるからです。
しかし、それはすべて私の側の憶測です。