Swift从本地视频生成缩略图遇AVFoundationErrorDomain错误求助
解决本地视频生成缩略图时AVFoundationErrorDomain -11850错误
错误原因分析
错误码-11850结合底层-12939(对应kFigPlaybackErrorCannotOpenFile),核心问题是AVFoundation无法正常读取目标视频文件,常见诱因包括文件路径无效、权限不足、视频格式不兼容或第一帧无法解码。
具体解决步骤
1. 验证文件路径与权限
- 先确认URL指向的文件真实存在:
guard FileManager.default.fileExists(atPath: url.path) else { print("文件不存在:\(url.path)") return nil } - 若视频来自文件App/iOS沙箱外,需启用安全范围访问(iOS 14+):
guard url.startAccessingSecurityScopedResource() else { print("无法获取文件访问权限") return nil } // 生成缩略图的代码逻辑... url.stopAccessingSecurityScopedResource() // 操作完成后必须关闭权限 - 若视频来自相册,确保已申请
PHPhotoLibrary访问权限,且获取的是正确的文件URL(而非PHAsset的标识符)。
2. 调整AVAssetImageGenerator配置
- 启用轨道旋转适配:避免缩略图方向错误,同时修复部分解码兼容性问题
- 避开视频第一帧:部分视频第一帧为空或无法解码,尝试取0.1秒处的帧
- 限制缩略图尺寸:减少内存占用,提升生成效率
修改后的代码示例:
func getImageFromUrl(url: URL) -> UIImage? { print("视频路径:\(url)") // 验证文件存在 guard FileManager.default.fileExists(atPath: url.path) else { print("文件不存在:\(url.path)") return nil } let videoAsset = AVURLAsset(url: url) let thumbnailGenerator = AVAssetImageGenerator(asset: videoAsset) // 关键配置 thumbnailGenerator.appliesPreferredTrackTransform = true thumbnailGenerator.maximumSize = CGSize(width: 300, height: 300) // 按需调整尺寸 // 取0.1秒处的帧,规避第一帧解码问题 let targetTime = CMTimeMake(value: 1, timescale: 10) do { let cgImage = try thumbnailGenerator.copyCGImage(at: targetTime, actualTime: nil) return UIImage(cgImage: cgImage) } catch let error as NSError { print("生成缩略图失败:\(error.localizedDescription)") print("错误详情:\(error.userInfo)") } return nil }
3. 额外排查点
- 测试视频本身是否正常:用系统自带播放器打开该视频,确认能正常播放(排除文件损坏或格式不兼容)
- 检查线程环境:尽量在后台线程执行缩略图生成操作,避免阻塞主线程
- 若视频是下载所得:确保文件已完全写入本地,未因下载中断导致文件损坏
内容的提问来源于stack exchange,提问作者Aviram Netanel
相关产品推荐
相关产品推荐

