我正在开发一个应用程序,它使用 AVMutableVideoComposition
和 AVVideoCompositionCoreAnimationTool
(通过 AVExportSession
导出)在 2-10 秒的视频中导出 CALayer 动画.
每个合成中可以有数百个 CAShapeLayer,每个都有动画。
let animationLayer = CALayer()
animationLayer.frame = CGRectMake(0, 0, size.width, size.height)
animationLayer.geometryFlipped = true
// Add a ton of CAShapeLayers with CABasicAnimation's to animation Layer
let parentLayer = CALayer()
let videoLayer = CALayer()
parentLayer.frame = CGRectMake(0, 0, size.width, size.height)
videoLayer.frame = CGRectMake(0, 0, size.width, size.height)
parentLayer.addSublayer(videoLayer)
parentLayer.addSublayer(animationLayer)
mainCompositionInst.animationTool = AVVideoCompositionCoreAnimationTool(postProcessingAsVideoLayer: videoLayer, inLayer: parentLayer)
let exporter = AVAssetExportSession(asset: mixComposition, presetName: AVAssetExportPresetHighestQuality)
exportSession.outputURL = finalUrl
exportSession.outputFileType = AVFileTypeQuickTimeMovie
exportSession.shouldOptimizeForNetworkUse = true
exportSession.videoComposition = mainCompositionInst
exportSession.exportAsynchronouslyWithCompletionHandler(...)
现在,这完全有效。但是,当动画数量众多时,合成导出可能会非常慢(导出需要 15-25 秒)。我对加快导出性能的任何想法感兴趣。
到目前为止,我的一个想法是进行多次合成/导出过程,并在每次过程中添加“合理”数量的动画层。但我有一种感觉,只会让它变慢。
或者,也许可以导出许多较小的视频,每个视频都包含“合理”数量的动画层,然后将它们组合在一起以最终导出。
还有其他想法吗?缓慢只是生活中的一个事实吗?我将不胜感激任何见解!我是 AVFoundation 的新手。
最佳答案
我沿着视频合成路径走下去,不喜欢 AVAssetExportSession
强制执行的恒定帧速率,所以我手动将我的内容渲染到 AVAssetReader
的输出和编码它与 AVAssetWriter
一起移动。
如果您有很多内容,您可以将其转换为 OpenGL/Metal 并使用 GPU 通过 texture caches 将其直接快速渲染到您的视频帧上。 .
我打赌 GPU 不会出汗,所以您会受到视频编码器速度的限制。我不确定那是什么 - 4s 曾经做 3 倍实时,只能改进。
要执行我的建议,需要进行大量操作。您可以使用 GPUImage 快速开始 OpenGL 路径。 ,尽管 Metal 版本会非常酷。
关于ios - 具有大量子层/动画的 AVVideoCompositionCoreAnimationTool 导出性能,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/33631538/