我正在开发一款应用,可以使用AVMutableVideoComposition
和AVVideoCompositionCoreAnimationTool
(通过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的新手。
答案 0 :(得分:0)
我查看了视频合成路径,并不喜欢AVAssetExportSession
强制执行的固定帧速率,因此我手动将我的内容渲染到AVAssetReader
的输出并对其进行编码用AVAssetWriter
进行移动。
如果您有很多内容,可以将其转换为OpenGL / Metal并使用GPU通过texture caches将其快速直接渲染到您的视频帧上。
我敢打赌GPU不会出汗,所以你必须受到视频编码器速度的限制。我不确定那是什么 - 用于实时3倍的4s,只能改进。
要做我建议的事情需要很多摆弄。您可以使用GPUImage在OpenGL路径上快速入门,尽管Metal版本非常酷。