ARTICLE DETAIL

资讯详情

深耕网站建设、视觉设计与SEO优化的一线实战洞察。

从零构建iOS自定义相机:AVFoundation主链路与RAW输出实践

从零构建iOS自定义相机:AVFoundation主链路与RAW输出实践 Camera Sun 是一个在 Show HN 上发布过的 iOS 相机项目核心意图是修复 iPhone 自带相机 App 在使用中的某类痛点。虽然不同的人对“自带相机哪里不够好”有不同答案但只要是做替代相机 App技术路线基本是同一套用 AVFoundation 搭会话、接管曝光和对焦、输出 RAW、再做后处理。这里不展开某个具体项目的实现细节而是以“做一个能用、可控、能导出高质量照片的相机 App”为目标从零讲解 iOS 相机开发的主链路。适合有 Swift 和 UIKit 基础、但没完整写过 AVFoundation 相机项目的开发者。读完以后你可以自己搭出一个替代系统相机的原型并且知道每一步为什么要这样配置、出了问题去哪查。1. 先理清“修复 iPhone 相机”到底要修什么1.1 自带相机的主要限制iPhone 自带相机日常使用确实强但它并不是为“可控性”设计的。系统会自动做大量决定Smart HDR 多帧合成把高光压暗、暗部提亮结果人像皮肤和物体纹理容易被处理得不够自然。深度融合会在中低光场景做降噪和锐化细节看着干净但观感偏“计算味”。默认保存格式是 HEIC画质已经不错但后期空间远不如 RAW。交互层不提供直方图也不提供曝光锁定后的精确参数调节界面。对普通用户这些不是问题但对摄影爱好者和开发者这些自动处理就是“缺陷”。自定义相机 App 的价值在很大程度上就在这里绕开部分计算摄影流程把处理权交给用户。这里用一张表来对应痛点和解决方向自带相机的表现背后的处理链自定义相机可以做什么高光被明显压暗Smart HDR 多帧合成手动锁定曝光或直接拍 RAW人脸皮肤过于平滑深度融合针对皮肤降噪拍 RAW后处理阶段自己决定降噪强度夜景快门完全自动夜景模式决定时长手动设置 ISO 与快门没有直方图与过曝提示交界面不提供在自定义界面自己绘制1.2 替代相机的产品定位与技术边界如果只是把系统相机的按钮都改成滑块体验不会更好。Camera Sun 这类项目要成立得先选一个具体场景是解决阳光直射下的高对比度拍摄还是解决夜景噪点还是解决 RAW 流程繁琐。选一个点做深比做全更实际。这里要注意技术边界。指望自定义相机完全关闭所有计算摄影并不现实苹果在不同机型上提供的 API 差异很大iPhone 的 ISP 处理和传感器数据读取路径并未全部对开发者开放。因此“修复”的边界要提前想清楚哪些能被 AVFoundation 控制哪些只能通过 RAW 后处理来绕开。对这个边界认识得越清楚后面做 UI、做参数面板时就越不会跑偏。2. 搭建最小相机工程环境、授权和会话骨架2.1 环境要求与 Info.plist 配置相机开发必须用真机模拟器没有真实摄像头。环境方面建议满足几个条件Xcode 保持较新版本至少能拉取当前主流的 iOS SDK。测试机覆盖 iPhone 12 之后机型因为 ProRAW、多摄切换、新格式支持都依赖硬件能力。项目使用 Swift 和 UIKit 起步SwiftUI 也可以但 AVFoundation 的代码完全复用。Info.plist 必须先声明相机权限否则启动取景会话时会直接失败keyNSCameraUsageDescription/key string需要使用相机来拍摄照片/string keyNSPhotoLibraryAddUsageDescription/key string需要将拍摄的照片保存到相册/string2.2 相机权限请求顺序在开始任何 AVCaptureSession 相关工作前先请求权限。正确顺序是请求授权、授权成功、配置会话、启动预览。不要反过来。import AVFoundation enum CameraPermission { static func request() async - Bool { switch AVCaptureDevice.authorizationStatus(for: .video) { case .authorized: return true case .notDetermined: return await AVCaptureDevice.requestAccess(for: .video) default: return false } } }这里最常犯的错误是在权限未确定时直接创建AVCaptureDeviceInput系统会抛异常。授权被拒绝后也要走 UI 提示引导用户去系统设置里开启而不是让会话静默失败。相机权限属于高敏感权限用户拒绝一次后系统不会再弹窗后续只能通过设置页跳转解决。2.3 会话、输入、输出的三件套关系AVFoundation 相机体系由三部分组成AVCaptureSession负责协调数据流相当于整个相机的总管。AVCaptureDeviceInput把某个物理设备后置摄像头、前置摄像头、麦克风接入会话
返回列表