我使用AVFoundation创建了一个相机。我想将闪光灯设置为自动,因此用户无需处理它。我尝试添加代码backCamera.flashMode = AVCaptureFlashMode.Auto
,但它似乎无法正常工作。非常感谢您提供的任何反馈!!
func setUpCamera() {
captureSession = AVCaptureSession()
captureSession!.sessionPreset = AVCaptureSessionPresetPhoto
let backCamera = AVCaptureDevice.defaultDeviceWithMediaType(AVMediaTypeVideo)
// CODE THAT SEEMS LIKE IT SHOULD WORK
if backCamera.hasFlash {
backCamera.flashMode = AVCaptureFlashMode.Auto
}
var error: NSError?
var input: AVCaptureDeviceInput!
do {
input = try AVCaptureDeviceInput(device: backCamera)
} catch let error1 as NSError {
error = error1
input = nil
}
if error == nil && captureSession!.canAddInput(input) {
captureSession!.addInput(input)
stillImageOutput = AVCaptureStillImageOutput()
stillImageOutput!.outputSettings = [AVVideoCodecKey: AVVideoCodecJPEG]
if captureSession!.canAddOutput(stillImageOutput) {
captureSession!.addOutput(stillImageOutput)
previewLayer = AVCaptureVideoPreviewLayer(session: captureSession)
previewLayer!.videoGravity = AVLayerVideoGravityResizeAspectFill
previewLayer!.connection?.videoOrientation = AVCaptureVideoOrientation.Portrait
previewVideoView.layer.addSublayer(previewLayer!)
captureSession!.startRunning()
}
}
}
@IBAction func onSnapPhotoButtonPressed(sender: UIButton) {
if let videoConnection = stillImageOutput!.connectionWithMediaType(AVMediaTypeVideo) {
videoConnection.videoOrientation = AVCaptureVideoOrientation.Portrait
stillImageOutput?.captureStillImageAsynchronouslyFromConnection(videoConnection, completionHandler: {(sampleBuffer, error) in
if (sampleBuffer != nil) {
let imageData = AVCaptureStillImageOutput.jpegStillImageNSDataRepresentation(sampleBuffer)
let dataProvider = CGDataProviderCreateWithCFData(imageData)
let cgImageRef = CGImageCreateWithJPEGDataProvider(dataProvider, nil, true, CGColorRenderingIntent.RenderingIntentDefault)
let image = UIImage(CGImage: cgImageRef!, scale: 1.0, orientation: UIImageOrientation.Right)
self.imageView.image = image
self.clearPhotoButton.hidden = false
self.nextButton.hidden = false
self.view.bringSubviewToFront(self.imageView)
}
})
}
}
答案 0 :(得分:5)
来自文档:
在尝试设置捕获设备的属性(其对焦模式,曝光模式等)之前,必须先使用
lockForConfiguration:
方法获取设备上的锁定。然后,您可以使用unlockForConfiguration
方法设置属性并释放锁定。
我不认为你这样做。
答案 1 :(得分:2)
想出来,万一其他人遇到这个。而不是
if backCamera.hasFlash {
backCamera.flashMode = AVCaptureFlashMode.Auto
}
它应该是......
if backCamera.hasFlash {
do {
try backCamera.lockForConfiguration()
backCamera.flashMode = AVCaptureFlashMode.Auto
backCamera.unlockForConfiguration()
} catch {
// handle error
}