I am generating animated gif from a mutable composition where I am setting AVMutableVideoComposition
with AVVideoCompositionCoreAnimationTool
. Problem is with core animation tool, when it's set generated images have 1 column of green pixels on the very right. If I don't add core animation tool it works perfectly.
Example of generated gif is here:
This is how I am creating AVVideoCompositionCoreAnimationTool
object with layers.
let parentLayer = CALayer()
let videoLayer = CALayer()
let assetsLayer = self.assetsLayer!
assetsLayer.isGeometryFlipped = true
parentLayer.frame = CGRect(origin: CGPoint.zero, size: videoComposition.renderSize)
videoLayer.frame = CGRect(origin: CGPoint.zero, size: videoComposition.renderSize)
assetsLayer.frame = CGRect(origin: CGPoint.zero, size: videoComposition.renderSize)
parentLayer.addSublayer(videoLayer)
parentLayer.addSublayer(assetsLayer)
videoComposition.animationTool = AVVideoCompositionCoreAnimationTool(postProcessingAsVideoLayer: videoLayer, in: parentLayer)
I found out that if I make video layer 2 pixels wider so that green pixels are offscreen it will work. But it's dirty hack.
videoLayer.frame = CGRect(origin: CGPoint.zero, size: videoComposition.renderSize).insetBy(dx: -2, dy: -2)
Does anyone know why I am having green column and what am I doing wrong?
I found out what the problem was. I was specifying render size of AVMutableVideoComposition
with odd value of width (375px). It looks like I have to use even numbers only because rendered video was 376px wide and renderer probably let me know that it added 1 extra column. Strange that this is not mentioned in wwdc videos nor programming guide.