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

标签 ios core-animation avfoundation

我正在开发一个应用程序,它使用 AVMutableVideoCompositionAVVideoCompositionCoreAnimationTool(通过 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/

相关文章:

ios - 恢复应用内购买

ios - subview 上的 UIButton 不响应触摸内部事件

objective-c - 检查 NSAnimationContext runAnimationGroup 是否取消或成功

ios - 如何在 Xcode 4.3 中成功使用 BOOL

ios - 为什么在 id<NSCopying> 上保留会发出警告?

ios - swift3 uitableView 重新加载使屏幕闪烁

iphone - 将核心动画与 OpenGL ES 结合

objective-c - UIView animateKeyframesWithDuration 与标准动画 block 动画不同

ios - 如何从 AVCapturePhoto 获取元数据值?

iphone - AVAssetExportSession 错误 -11820