AVCaptureDevice的exposureDuration和iso属性不被AVCapturePhotoOutput所遵循,因为AVCapturePhotoOutput是用于拍摄静态照片的,而不是处理实时视频流的。但我们可以使用AVCaptureVideoDataOutput来获取实时视频流,并使用AVCaptureDevice的exposureDuration和iso属性来设置摄像头的曝光时间和ISO值。
以下是一个示例代码,演示了如何使用AVCaptureVideoDataOutput来获取实时视频流,并设置摄像头的曝光时间和ISO值:
import AVFoundation
class ViewController: UIViewController, AVCaptureVideoDataOutputSampleBufferDelegate {
private var captureSession: AVCaptureSession!
private var videoPreviewLayer: AVCaptureVideoPreviewLayer!
private var captureDevice: AVCaptureDevice!
override func viewDidLoad() {
super.viewDidLoad()
// 创建AVCaptureSession
captureSession = AVCaptureSession()
// 配置摄像头
captureDevice = AVCaptureDevice.default(for: .video)
configureCamera()
// 配置视频输出
let videoOutput = AVCaptureVideoDataOutput()
videoOutput.setSampleBufferDelegate(self, queue: DispatchQueue.global(qos: .userInteractive))
captureSession.addOutput(videoOutput)
// 配置视频预览层
videoPreviewLayer = AVCaptureVideoPreviewLayer(session: captureSession)
videoPreviewLayer.videoGravity = .resizeAspectFill
videoPreviewLayer.frame = view.bounds
view.layer.addSublayer(videoPreviewLayer)
// 启动捕捉会话
captureSession.startRunning()
}
private func configureCamera() {
do {
// 锁定摄像头,以便进行设置
try captureDevice.lockForConfiguration()
// 设置曝光时间
let exposureDuration = CMTimeMake(value: 1, timescale: 1000) // 设置曝光时间为1/1000秒
if captureDevice.isExposureModeSupported(.custom) {
captureDevice.setExposureModeCustom(duration: exposureDuration, iso: AVCaptureDevice.currentISO, completionHandler: nil)
}
// 设置ISO值
if captureDevice.isISOControlModeSupported(.manual) {
captureDevice.setExposureModeCustom(duration: AVCaptureDevice.currentExposureDuration, iso: 100, completionHandler: nil)
}
// 解锁摄像头
captureDevice.unlockForConfiguration()
} catch {
print("配置摄像头失败: \(error.localizedDescription)")
}
}
// AVCaptureVideoDataOutputSampleBufferDelegate方法,处理实时视频流
func captureOutput(_ output: AVCaptureOutput, didOutput sampleBuffer: CMSampleBuffer, from connection: AVCaptureConnection) {
// 实时视频流处理逻辑
}
}
此示例代码设置了摄像头的曝光时间为1/1000秒,并将ISO值设置为100。你可以根据需要调整这些值。