AVVideoCompositionCoreAnimationTool导出具有大量子图层/动画的性能

时间:2015-11-10 13:49:17

标签: ios core-animation avfoundation

我正在开发一款应用,可以使用AVMutableVideoCompositionAVVideoCompositionCoreAnimationTool(通过AVExportSession导出)在2-10秒的视频中导出CALayer动画。

每个合成中都有数百个CAShapeLayers,每个都会附加动画。

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的新手。

1 个答案:

答案 0 :(得分:0)

我查看了视频合成路径,并不喜欢AVAssetExportSession强制执行的固定帧速率,因此我手动将我的内容渲染到AVAssetReader的输出并对其进行编码用AVAssetWriter进行移动。

如果您有很多内容,可以将其转换为OpenGL / Metal并使用GPU通过texture caches将其快速直接渲染到您的视频帧上。

我敢打赌GPU不会出汗,所以你必须受到视频编码器速度的限制。我不确定那是什么 - 用于实时3倍的4s,只能改进。

要做我建议的事情需要很多摆弄。您可以使用GPUImage在OpenGL路径上快速入门,尽管Metal版本非常酷。