AVMutableVideoComposition的frameDuration不生效,无法设置导出帧率怎么办?
解决AVMutableVideoComposition frameDuration不生效的问题
我之前也踩过这个一模一样的坑!你遇到的问题核心在于AVAssetExportSession对预设的选择以及合成参数的优先级处理,下面给你拆解原因和解决方案:
为什么frameDuration被忽略?
AVAssetExportPresetPassthrough完全不处理合成:这个预设的作用是直接透传原视频的媒体数据,不会执行任何渲染或编码操作,所以你的videoComposition所有设置(包括帧率、transform)都会被直接忽略——这就是你换这个预设没用的原因。AVAssetExportPresetHEVCHighestQuality这类预设的优先级问题:这类“最高质量”预设会优先匹配原视频的编码参数(包括帧率),除非你强制指定需要重新编码的参数,否则AVFoundation会默认沿用原帧率导出。
具体修复步骤
1. 选择需要重新编码的导出预设
放弃Passthrough和“最高质量”这类模糊预设,改用明确需要重新编码的预设,比如:
AVAssetExportPresetHEVC1920x1080(指定分辨率的HEVC预设)AVAssetExportPresetMediumQuality(中等质量预设)- 自定义分辨率的预设(如果需要特定输出尺寸)
2. 正确设置AVMutableVideoComposition的参数
除了frameDuration,还要确保renderSize和源视频尺寸匹配(或你需要的输出尺寸),同时用更精确的时间刻度避免浮点误差:
AVMutableVideoComposition *videoComposition = [AVMutableVideoComposition videoComposition]; // 10fps,用600作为时间刻度(AVFoundation常用的高精度时间基准) videoComposition.frameDuration = CMTimeMake(60, 600); // 等价于1/10秒,比CMTimeMakeWithSeconds(1,10)更精确 videoComposition.renderSize = yourSourceVideoTrack.naturalSize; // 和源视频尺寸一致 // 你的其他设置:transform、compositionInstructions等
3. 确保导出会话正确关联videoComposition
一定要把配置好的videoComposition赋值给导出会话,并且这一步建议放在设置其他导出参数之前:
AVAssetExportSession *exportSession = [[AVAssetExportSession alloc] initWithAsset:yourCombinedAsset presetName:AVAssetExportPresetHEVC1920x1080]; exportSession.videoComposition = videoComposition; // 关键!必须完成这个赋值 exportSession.outputFileType = AVFileTypeHEVC; exportSession.outputURL = yourOutputURL; // 启动导出任务 [exportSession exportAsynchronouslyWithCompletionHandler:^{ // 处理导出结果 }];
4. 检查视频轨道指令的时间范围
如果你用了AVMutableVideoCompositionInstruction和AVMutableVideoCompositionLayerInstruction,要确保指令的timeRange完全覆盖合成的时间线,并且没有强制绑定原轨道的帧率参数。
验证方法
导出后可以用QuickTime Player查看视频信息(右键视频→显示检查器),确认帧率是否已经变成10fps。如果还是不行,可以尝试清空导出缓存或者重启Xcode,有时候AVFoundation的缓存会导致参数不生效。
内容的提问来源于stack exchange,提问作者Can Poyrazoğlu
相关产品推荐
相关产品推荐

