Swift中如何将file:///路径下的视频保存至相机胶卷?
嘿,我来帮你搞定这个把临时视频存到相机胶卷的问题!你之前尝试的代码方向是对的,但大概率是权限没配置或者URL处理出了问题,咱们一步步来解决:
解决步骤
1. 先配置相册权限
这是很多人容易漏掉的关键步骤!你需要在项目的Info.plist里添加权限说明,iOS才会允许你的应用访问相册:
- 添加
NSPhotoLibraryAddUsageDescription键,值填你需要权限的原因(比如"需要将拍摄的视频保存到您的相册") - 如果你的应用还需要读取相册内容,再额外添加
NSPhotoLibraryUsageDescription,但单纯只做保存的话,前者就足够了
2. 正确处理视频URL
你之前那段把videoURL.absoluteString转成新URL的操作是错误的!absoluteString会包含file://前缀,而fileURLWithPath:需要的是不带前缀的纯本地文件路径。正确的做法是直接使用你拿到的临时videoURL,只要它是有效的本地文件URL(可以用videoURL.isFileURL验证是否返回true)。
3. 完整的可运行代码示例
下面是包含权限检查、错误处理的完整实现,直接用就行:
import Photos func saveVideoToCameraRoll(videoURL: URL) { // 先请求相册添加权限 PHPhotoLibrary.requestAuthorization(for: .addOnly) { authorizationStatus in switch authorizationStatus { case .authorized, .limited: // 权限通过,执行保存操作 PHPhotoLibrary.shared().performChanges({ // 直接传入你的临时视频URL,确保它是有效的fileURL _ = PHAssetChangeRequest.creationRequestForAssetFromVideo(atFileURL: videoURL) }) { isSuccess, error in // 回到主线程更新UI或提示用户 DispatchQueue.main.async { if isSuccess { print("视频成功保存到相机胶卷啦!") // 这里可以给用户弹个Alert提示成功 } else { print("保存失败:\(error?.localizedDescription ?? "未知错误")") } } } case .denied, .restricted: DispatchQueue.main.async { print("没有相册权限,请去设置里开启权限哦") // 可以引导用户跳转到设置页面开启权限 } case .notDetermined: // 理论上不会走到这里,因为我们刚发起了权限请求 break @unknown default: break } } }
4. 常见问题排查
如果还是保存失败,可以从这几个方向检查:
- 验证临时视频文件是否存在:用
FileManager.default.fileExists(atPath: videoURL.path)检查返回值 - 查看错误信息:
performChanges的error参数会告诉你具体失败原因,比如文件损坏、URL无效等 - 确认沙盒权限:你的应用只能访问自己沙盒内的文件,临时路径如果是你自己应用生成的,肯定是可以访问的
内容的提问来源于stack exchange,提问作者K.Wu




