跳到主要内容

相机开发

问题

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 声明 NSCameraUsageDescriptionNSMicrophoneUsageDescription,并在代码中请求授权。


常见面试问题

Q1: 前后摄像头切换怎么实现?

答案:移除当前 input,创建新的 AVCaptureDeviceInput(切换 .front / .back),重新添加到 session。需要在 beginConfiguration() / commitConfiguration() 之间操作。

相关链接