使用AVCaptureSession录制视频如何免拷贝直接存入iOS系统相册
解决方案
可以实现,使用iOS原生的PhotoKit框架即可直接将沙盒内的视频文件移动到系统相册,无需生成额外拷贝,也就不需要预留两倍视频大小的存储空间。
前置要求
- 应用适配iOS 9.0及以上系统版本
- 先在Info.plist中添加
NSPhotoLibraryAddUsageDescription权限声明,获取用户相册写入授权后再执行保存操作
核心逻辑
旧接口UISaveVideoAtPathToSavedPhotosAlbum(:::)内部默认执行文件拷贝逻辑,会生成一份完整的视频副本写入相册。而PhotoKit提供的PHAssetCreationRequest支持移动文件选项,会直接修改文件系统的文件映射关系,将沙盒内的视频文件转移到相册目录,全程无额外数据拷贝,操作完成后原沙盒路径的文件会被系统自动清理。
代码示例
Swift版本
import Photos // 替换为你录制好的视频在沙盒内的本地路径 let videoLocalURL = URL(fileURLWithPath: "your_video_sandbox_path") PHPhotoLibrary.shared().performChanges { let createRequest = PHAssetCreationRequest.forAsset() let resourceOptions = PHAssetResourceCreationOptions() // 开启移动文件开关,核心配置 resourceOptions.isMoveFile = true createRequest.addResource(with: .video, fileURL: videoLocalURL, options: resourceOptions) } completionHandler: { isSuccess, error in if isSuccess { // 保存成功,原沙盒路径的视频已被系统自动删除 } else { // 保存失败,可通过error判断具体原因:权限不足/空间不足/格式不支持等 print("保存视频失败: \(error?.localizedDescription ?? "未知错误")") } }
Objective-C版本
#import <Photos/Photos.h> // 替换为你录制好的视频在沙盒内的本地路径 NSURL *videoLocalUrl = [NSURL fileURLWithPath:@"your_video_sandbox_path"]; [[PHPhotoLibrary sharedPhotoLibrary] performChanges:^{ PHAssetCreationRequest *createRequest = [PHAssetCreationRequest creationRequestForAsset]; PHAssetResourceCreationOptions *resourceOptions = [[PHAssetResourceCreationOptions alloc] init]; // 开启移动文件开关,核心配置 resourceOptions.moveFile = YES; [createRequest addResourceWithType:PHAssetResourceTypeVideo fileURL:videoLocalUrl options:resourceOptions]; } completionHandler:^(BOOL isSuccess, NSError * _Nullable error) { if (isSuccess) { // 保存成功,原沙盒路径的视频已被系统自动删除 } else { // 保存失败,可通过error判断具体原因 NSLog(@"保存视频失败: %@", error.localizedDescription); } }];
注意事项
- 仅当视频文件和相册存储在同一个磁盘分区时才会执行移动操作,iOS设备默认满足该条件,无需额外处理
- 保存成功后不要手动删除原沙盒路径的文件,系统会自动完成清理
- 如果保存失败,原沙盒路径的视频文件会被保留,你可以自行决定重试或者删除
内容的提问来源于stack exchange,提问作者odyth
相关产品推荐
相关产品推荐

