I have a function to filter an AVPlayerItem's asset. One of the problems was setting the transform of the video. However, whenever I set the AVMutableVideoCompositionInstruction of the AVMutableVideoComposition, the handler is no longer called.
Here is my code:
private func filter(playerItem: AVPlayerItem) {
let videoComposition = AVMutableVideoComposition(asset: playerItem.asset, applyingCIFiltersWithHandler: { (request) in
print("Composing") // does not print whenever the instructions are added
if let filteredImage = filterImage(request.sourceImage) {
request.finish(with: filteredImage, context: nil)
} else {
request.finish(with: RenderError.couldNotFilter) // An error
}
})
guard let videoTrack = playerItem.asset.tracks(withMediaType: .video).first else { return }
let size = CGSize(width: videoTrack.naturalSize.height, height: videoTrack.naturalSize.width)
videoComposition.renderSize = size
let videoInstruction = AVMutableVideoCompositionInstruction()
videoInstruction.timeRange = CMTimeRange(start: kCMTimeZero, duration: playerItem.asset.duration)
let transformInstruction = AVMutableVideoCompositionLayerInstruction(assetTrack: videoTrack)
let translate = CGAffineTransform(translationX: size.width, y: size.height)
let rotate = CGAffineTransform(rotationAngle: CGFloat.pi)
transformInstruction.setTransform(translate.concatenating(rotate), at: kCMTimeZero)
videoInstruction.layerInstructions.append(transformInstruction)
videoComposition.instructions.append(videoInstruction)
playerItem.videoComposition = videoComposition
}
Why is the handler no longer called, and how can I fix it?
I will give you so many brownie points if you can answer!