iOS Swift中录制视频时如何抓拍照片并保存至相册?
嘿,我看你正在实现录制视频时抓拍照片并保存到系统相册的功能,这里给你完善代码逻辑,帮你落地这个需求:
实现录制视频时抓拍照片并保存到系统相册
首先要确认你已经正确配置了AVCaptureSession,包含视频录制输出(AVCaptureMovieFileOutput)和照片抓拍输出(AVCapturePhotoOutput)。接下来一步步完善你的功能:
1. 提前准备:相册权限检查
在使用系统相册前,必须先请求用户授权,你可以在页面初始化时添加这段逻辑:
import Photos override func viewDidLoad() { super.viewDidLoad() // 请求相册访问权限 PHPhotoLibrary.requestAuthorization { status in if status != .authorized { DispatchQueue.main.async { let alert = UIAlertController(title: "权限提示", message: "需要访问相册权限来保存抓拍的照片", preferredStyle: .alert) alert.addAction(UIAlertAction(title: "确定", style: .default)) self.present(alert, animated: true) } } } }
2. 完善抓拍按钮的点击事件
修改你的HightLightButtonClicked方法,在原有高亮片段标记逻辑的基础上,添加抓拍+保存相册的逻辑:
var photoTagImage = Data() // 用于录制视频时抓拍照片的高亮按钮 @IBAction func HightLightButtonClicked(_ sender: UIButton) { self.selectedtagsArray = NSMutableArray.init() // 保留你原有的高亮片段标记逻辑 if self.recordEventInfo.isDayEvent { let clipSecond: Int64 = 30 let clipName: String = "Hightlight" let dict: Dictionary<String, Any> = ["clipSecond": clipSecond, "clipName": clipName] self.selectedtagsArray.add(dict) // 这里可以继续处理你原有的片段相关逻辑 } // -------------------- 新增:抓拍照片并保存到相册 -------------------- // 从捕获会话中获取照片输出实例 guard let photoOutput = self.captureSession.outputs.first(where: { $0 is AVCapturePhotoOutput }) as? AVCapturePhotoOutput else { print("未配置AVCapturePhotoOutput,无法抓拍照片") return } // 配置照片抓拍参数 let photoSettings = AVCapturePhotoSettings() if photoOutput.supportedFlashModes.contains(.auto) { photoSettings.flashMode = .auto // 自动闪光灯 } // 触发抓拍 photoOutput.capturePhoto(with: photoSettings, delegate: self) }
3. 实现照片捕获回调,完成保存
让你的ViewController遵循AVCapturePhotoCaptureDelegate协议,处理抓拍完成后的逻辑:
extension YourViewController: AVCapturePhotoCaptureDelegate { func photoOutput(_ output: AVCapturePhotoOutput, didFinishProcessingPhoto photo: AVCapturePhoto, error: Error?) { guard error == nil else { print("抓拍照片失败:\(error!.localizedDescription)") return } // 获取抓拍的照片数据 guard let imageData = photo.fileDataRepresentation() else { print("无法获取照片数据") return } self.photoTagImage = imageData // 将照片保存到系统相册 PHPhotoLibrary.shared().performChanges({ // 创建相册资源请求并添加照片数据 PHAssetCreationRequest.forAsset().addResource(with: .photo, data: imageData, options: nil) }) { success, error in DispatchQueue.main.async { if success { let alert = UIAlertController(title: "成功", message: "抓拍照片已保存到相册", preferredStyle: .alert) alert.addAction(UIAlertAction(title: "确定", style: .default)) self.present(alert, animated: true) } else { let alert = UIAlertController(title: "失败", message: "保存照片失败,请检查相册权限", preferredStyle: .alert) alert.addAction(UIAlertAction(title: "确定", style: .default)) self.present(alert, animated: true) print("保存失败原因:\(error?.localizedDescription ?? "未知错误")") } } } } }
关键注意事项
- 确保你的
AVCaptureSession已经添加了AVCapturePhotoOutput输出,否则抓拍会失败:let photoOutput = AVCapturePhotoOutput() if captureSession.canAddOutput(photoOutput) { captureSession.addOutput(photoOutput) } - 录制视频和抓拍照片可以同时进行,
AVCaptureSession支持多输出共存 - 必须在
Info.plist中添加权限描述,否则App会崩溃:NSCameraUsageDescription:相机使用说明NSPhotoLibraryAddUsageDescription:相册写入权限说明
内容的提问来源于stack exchange,提问作者PvDev
相关产品推荐
相关产品推荐

