相机开发
问题
iOS 相机开发的核心 API 和流程?
答案
AVCaptureSession
拍照实现
import AVFoundation
class CameraManager: NSObject {
private let session = AVCaptureSession()
private let photoOutput = AVCapturePhotoOutput()
func setupCamera() {
session.sessionPreset = .photo
guard let camera = AVCaptureDevice.default(.builtInWideAngleCamera,
for: .video,
position: .back),
let input = try? AVCaptureDeviceInput(device: camera) else { return }
if session.canAddInput(input) { session.addInput(input) }
if session.canAddOutput(photoOutput) { session.addOutput(photoOutput) }
// 启动
DispatchQueue.global(qos: .userInitiated).async {
self.session.startRunning()
}
}
func capturePhoto() {
let settings = AVCapturePhotoSettings()
settings.flashMode = .auto
photoOutput.capturePhoto(with: settings, delegate: self)
}
}
extension CameraManager: AVCapturePhotoCaptureDelegate {
func photoOutput(_ output: AVCapturePhotoOutput,
didFinishProcessingPhoto photo: AVCapturePhoto, error: Error?) {
guard let data = photo.fileDataRepresentation() else { return }
let image = UIImage(data: data)
// 使用图片
}
}
权限
相机和麦克风需要在 Info.plist 声明 NSCameraUsageDescription 和 NSMicrophoneUsageDescription,并在代码中请求授权。
常见面试问题
Q1: 前后摄像头切换怎么实现?
答案:移除当前 input,创建新的 AVCaptureDeviceInput(切换 .front / .back),重新添加到 session。需要在 beginConfiguration() / commitConfiguration() 之间操作。