You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多
文档控制台
免费开始使用

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

火山引擎 最新活动