Create a more responsive camera experience
Media & Web 进阶 20m

打造更灵敏的相机拍摄体验

Create a more responsive camera experience

2023年6月5日

在 Apple 官方观看视频

一句话判断

如果你的相机 App 在连拍时感到”卡顿”,这场 Session 直接给出了解决方案——Deferred Photo Processing、Zero Shutter Lag 和 Responsive Capture 三套新 API,让用户不再因为处理等待而错过精彩瞬间。

这场 Session 讲了什么

iOS 17 为 AVFoundation 的拍照管线带来了四项重大更新:延迟照片处理(Deferred Photo Processing)、零快门延迟(Zero Shutter Lag)、响应式拍摄 API(Responsive Capture APIs)以及视频效果更新。

传统模式下,Deep Fusion 等高级图像处理算法会在拍摄完成后同步执行,阻塞下一次拍摄请求。用户连续点击快门时,处理未完成就没办法继续拍——这在运动、抓拍场景下体验很差。Deferred Photo Processing 改变了这个流程:拍摄时先返回一张轻量处理的”代理照片”(proxy photo),存入相册作为占位,真正的 Deep Fusion 处理在相机 Session 结束后由系统在后台完成。

Session 还展示了 Zero Shutter Lag 的工作原理:相机管线会提前缓存帧数据,用户按下快门时直接使用缓存的帧进行合成,而不是从按下的那一刻才开始采集,这大大降低了”拍到但没拍到想要瞬间”的概率。

Responsive Capture API 则提供了一种更激进的策略,在连拍时动态调整处理质量以换取更快的响应速度。

值得深挖的点

代理照片与最终照片的分离:这是一个很好的设计思路。代理照片立刻可用(虽然质量较低),最终照片异步生成。对于相册 App 来说,用户可以先浏览代理照片,最终照片在后台无缝替换。PHImageManager 在请求图片数据时,如果最终照片还没处理完,会触发按需处理。

Session Preset 的选择:要使用 Deferred Photo Processing,需要将 AVCaptureSession 的 preset 设为 .photo。不是所有 preset 都支持延迟处理,这一点在迁移时要注意。

帧缓存策略:Zero Shutter Lag 背后的帧缓存机制值得关注。相机管线在用户按下快门之前就开始保留帧数据,这意味着内存占用会增加。苹果在 API 设计上应该有自动的缓存淘汰策略,但对于开发者来说,了解这个机制的边界条件很重要。

代码片段

启用延迟照片处理:

let session = AVCaptureSession()
session.sessionPreset = .photo  // 必须使用 photo preset

let photoOutput = AVCapturePhotoOutput()
// 检查设备是否支持延迟处理
if photoOutput.isAutoDeferredPhotoDeliverySupported {
    // 启用延迟照片交付
    photoOutput.isAutoDeferredPhotoDeliveryEnabled = true
}

session.addOutput(photoOutput)
session.commitConfiguration()

处理代理照片回调并保存到相册:

func photoOutput(_ output: AVCapturePhotoOutput,
                 didFinishCapturingDeferredPhotoProxy proxy: AVCaptureDeferredPhotoProxy?) {
    guard let proxy = proxy, proxy.error == nil else { return }

    // 从代理对象获取照片数据
    guard let photoData = proxy.fileDataRepresentation else { return }

    // 保存到相册
    PHPhotoLibrary.shared().performChanges {
        let request = PHAssetCreationRequest.forAsset()
        request.addResource(with: .photo, data: photoData, options: nil)
    }
}

最佳实践

  • 延迟处理模式最适合 Deep Fusion 场景(iPhone 11 Pro 及更新机型),在老旧设备上回退到传统模式
  • 代理照片存入相册后,最终处理会在设备空闲时自动触发,也可以在请求图片时按需触发
  • 如果你的 App 需要即时分享高质量照片,可以在收到代理照片后手动触发最终处理
  • 监听 didFinishProcessingPhoto 回调来获取最终处理完成的通知

还有什么值得关注

  • Zero Shutter Lag 的内存管理策略和缓存帧数量限制需要查阅文档
  • 响应式拍摄 API 在视频录制场景下的表现
  • PhotoKit 中代理照片与最终照片的元数据差异
  • 视频效果(Video Effects)部分的更新内容,如 cinematic mode 的改进
WWDC 2023