AVAssetImageGenerator 使用动画工具和视频合成生成带有绿色像素的图像
AVAssetImageGenerator generating images with green pixels using animation tool and video composition
我正在从设置 AVMutableVideoComposition
和 AVVideoCompositionCoreAnimationTool
的可变合成生成动画 gif。问题出在核心动画工具上,当它被设置时生成的图像在最右边有 1 列绿色像素。如果我不添加核心动画工具,它会完美运行。
生成的 gif 示例在这里:
这就是我创建 AVVideoCompositionCoreAnimationTool
带图层的对象的方式。
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)
我发现如果我将视频层 2 像素加宽以便绿色像素在屏幕外,它就会起作用。但这是肮脏的技巧。
videoLayer.frame = CGRect(origin: CGPoint.zero, size: videoComposition.renderSize).insetBy(dx: -2, dy: -2)
有谁知道为什么我的栏是绿色的,我做错了什么?
我发现问题出在哪里了。我指定的渲染大小为 AVMutableVideoComposition
,宽度为奇数 (375px)。看起来我必须使用偶数只是因为渲染的视频是 376 像素宽,渲染器可能让我知道它添加了 1 个额外的列。奇怪的是,这在 wwdc 视频和编程指南中都没有提到。
我正在从设置 AVMutableVideoComposition
和 AVVideoCompositionCoreAnimationTool
的可变合成生成动画 gif。问题出在核心动画工具上,当它被设置时生成的图像在最右边有 1 列绿色像素。如果我不添加核心动画工具,它会完美运行。
生成的 gif 示例在这里:
这就是我创建 AVVideoCompositionCoreAnimationTool
带图层的对象的方式。
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)
我发现如果我将视频层 2 像素加宽以便绿色像素在屏幕外,它就会起作用。但这是肮脏的技巧。
videoLayer.frame = CGRect(origin: CGPoint.zero, size: videoComposition.renderSize).insetBy(dx: -2, dy: -2)
有谁知道为什么我的栏是绿色的,我做错了什么?
我发现问题出在哪里了。我指定的渲染大小为 AVMutableVideoComposition
,宽度为奇数 (375px)。看起来我必须使用偶数只是因为渲染的视频是 376 像素宽,渲染器可能让我知道它添加了 1 个额外的列。奇怪的是,这在 wwdc 视频和编程指南中都没有提到。