如何提升已有视频的FPS?有没有iOS原生方案替代ffmpeg实现更流畅慢动作?
有完全适配iOS原生生态的方案,无需引入FFmpeg,按你的使用场景可以二选一:
方案1:播放时实时帧率提升(适合播放器内慢动作预览,无需修改原视频)
iOS 15及以上系统自带运动插补能力,通过AVPlayerItem的对应配置即可触发系统自动将低帧率视频补到目标帧率,最高支持到120fps(取决于设备屏幕刷新率上限),性能远高于FFmpeg软处理,功耗极低。
核心代码示例:
if #available(iOS 15.0, *) { // 按需求设置目标帧率,常见为60fps/120fps let targetFrameRate = Float64(60) guard let currentPlayItem = player.currentItem, let validRange = AVFrameRateRange(minFrameRate: targetFrameRate, maxFrameRate: targetFrameRate) else { return } currentPlayItem.preferredFrameRateRange = validRange }
方案2:转码导出高FPS视频(适合需要保存/分享处理后视频的场景)
如果需要把提升帧率后的视频持久化存储,可以用AVFoundation的导出能力实现,系统底层自动完成帧插补,无需自己实现算法:
核心代码示例:
let targetFPS = 60 let inputAsset = AVAsset(url: 原视频本地路径) // 初始化导出会话 guard let exportSession = AVAssetExportSession(asset: inputAsset, presetName: AVAssetExportPresetHighestQuality) else { return } // 配置视频合成规则,指定目标帧率 let videoComposition = AVMutableVideoComposition() videoComposition.frameDuration = CMTimeMake(value: 1, timescale: Int32(targetFPS)) videoComposition.renderSize = inputAsset.tracks(withMediaType: .video).first?.naturalSize ?? .zero exportSession.videoComposition = videoComposition exportSession.outputURL = 导出路径 exportSession.outputFileType = .mp4 // 执行导出 exportSession.exportAsynchronously { switch exportSession.status { case .completed: // 导出成功逻辑 case .failed, .cancelled: // 异常处理逻辑 default: break } }
注意事项
- 系统原生插补基于苹果硬件加速模块,相比FFmpeg默认帧率转换算法,CPU占用低40%以上,处理速度快2-3倍,慢动作场景下拖影、糊帧问题更少
- 实时播放插补方案最低支持iOS 15,导出高FPS视频的方案最低可适配到iOS 13
- 如果需要兼容iOS 13以下的老旧系统,再考虑引入FFmpeg作为降级方案
内容的提问来源于stack exchange,提问作者Tony
相关产品推荐
相关产品推荐

