如何提升AVAssetExportSession的视频导出保存性能?
优化AVAssetExportSession导出速度的几个关键方向
我来帮你梳理下导出速度慢的核心问题,结合你的代码给出可落地的优化建议——之前做视频编辑类App时也踩过类似的坑,这些调整能大幅提升导出效率:
1. 替换过度消耗性能的导出预设
你当前用的AVAssetExportPresetHighestQuality是性能消耗最大的预设之一,它会强制对视频进行全量重新编码,哪怕原视频的编码格式、分辨率已经符合输出要求。
优化方案:
- 如果你的叠加层不需要改变原视频的编码/分辨率,直接用
AVAssetExportPresetPassthrough——这个预设会直接复用原视频的编码数据,只渲染叠加层部分,速度能提升好几倍 - 如果必须调整分辨率,选择对应分辨率的具体预设(比如
AVAssetExportPreset1920x1080),而不是模糊的“最高质量”
修改代码里的导出Session部分:
if let exportSession = AVAssetExportSession(asset: mutableComposition, presetName: AVAssetExportPresetPassthrough) { // 替换成Passthrough或具体分辨率预设 self.exportSession = exportSession exportSession.outputURL = outputURL exportSession.outputFileType = AVFileType.mp4 // 换成mp4兼容性更好,部分场景编码优化更优 exportSession.shouldOptimizeForNetworkUse = false // 如果不需要立即上传网络,关闭这个优化减少耗时 exportSession.videoComposition = layerComposition exportSession.exportAsynchronously(completionHandler: { // 处理导出结果 }) }
2. 简化视频合成的帧率设置
你代码里强制设置了layerComposition.frameDuration = CMTimeMake(value: 1, timescale: Int32(videoTrack.nominalFrameRate)),如果原视频是可变帧率(VFR),或者这个帧率和原视频的实际帧率不匹配,会导致导出时重新计算每一帧的时间戳,增加额外耗时。
优化方案:
直接复用原视频轨道的最小帧率,避免强制覆盖:
layerComposition.frameDuration = videoTrack.minFrameDuration
3. 优化Core Animation叠加层的渲染性能
AVVideoCompositionCoreAnimationTool的图层渲染是导出耗时的大头,尤其是图层复杂时。检查你的setupLayers()函数,做以下优化:
- 静态内容预合成:如果是固定的文字/图片叠加层,提前把它们合成一张UIImage,再作为单个CALayer添加,减少图层数量
- 减少透明图层:尽量给图层设置不透明的背景,避免Alpha通道带来的额外渲染计算
- 合理使用光栅化:对于静态图层,开启
layer.shouldRasterize = true并设置layer.rasterizationScale = UIScreen.main.scale,缓存渲染结果,避免重复计算
4. 简化视频变换计算
你代码里对视频transform的处理有些冗余,多次调整size和transform会让导出时的几何变换计算更复杂。建议:
- 尽量保持原视频的
renderSize,不要随意修改分辨率——缩放视频是非常消耗性能的操作 - 简化transform的逻辑,只保留必要的旋转/位移,避免多余的缩放计算
5. 检查合成轨道的冗余内容
确认getVideoComposition(asset: vidAsset)函数里没有添加多余的轨道(比如不需要的音频轨道、重复的视频片段),只保留需要编辑的主视频轨道,减少合成的复杂度。
内容的提问来源于stack exchange,提问作者Діма Комар
相关产品推荐
相关产品推荐

