Swift を使用して、AVPlayer のコンテンツをビューの AVPlayerLayer に表示しています。関連付けられた AVPlayerItem には videoComposition があり、それを作成するためのコードを少し単純化したバージョン (エラー チェックなどなし) は次のようになります。
playerItem.videoComposition = AVVideoComposition(asset: someAsset, applyingCIFiltersWithHandler: {
[unowned self] (request: AVAsynchronousCIImageFilteringRequest) in
let paramDict = << set up parameter dictionary based on class vars >>
// filter the image
let filter = self.ciFilterWithParamDict(paramDict) {
filter.setValue(request.sourceImage, forKey: kCIInputImageKey)
if let filteredImage = filter.outputImage {
request.finishWithImage(filteredImage, context: nil)
}
})
これは、AVPlayer が再生またはシークしているときに、すべて期待どおりに機能します。また、新しい videoComposition が作成されて読み込まれると、AVPlayerLayer が正しくレンダリングされます。
ただし、フィルターパラメーターの計算に使用する値の一部を変更したときに、AVPlayer/ AVPlayerItem/ AVVideoComposition を「トリガー」して再レンダリングする方法が見つかりませんでした。値を変更してから再生またはシークすると、正しくレンダリングされますが、再生またはシークの場合のみです。「その場で」レンダリングをトリガーする方法はありませんか?