You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.05.26 08:58:47