I am trying to simply put a Camera View in my View Controller.
I imported AVFoundation
at the top, as well as UIImagePickerControllerDelegate
and UINavigationControllerDelegate
classes.
However, whenever I try to use AVCaptureStillImageOutput
, Xcode tells me that it was deprecated in iOS10 and I should use AVCapturePhotoOutput
. That is completely fine, however, as soon as I want to call stillImageOutput.outputSettings
, .outputSettings
itself is not available. Thus, I have to use AVAVCaptureStillImageOutput
for it to work but I have multiple warnings because this function was deprecated in iOS10.
I searched and searched but could not really find the solution around it. I would really appreciate your help. I am learning so any explanation would be great! Code is below.
import UIKit
import AVFoundation
class CameraView: UIViewController, UIImagePickerControllerDelegate, UINavigationControllerDelegate {
var captureSession : AVCaptureSession?
var stillImageOutput : AVCaptureStillImageOutput?
var previewLayer : AVCaptureVideoPreviewLayer?
@IBOutlet var cameraView: UIView!
override func viewWillAppear(_ animated: Bool) {
super.viewWillAppear(animated)
captureSession = AVCaptureSession()
captureSession?.sessionPreset = AVCaptureSessionPreset1920x1080
var backCamera = AVCaptureDevice.defaultDevice(withMediaType: AVMediaTypeVideo)
var error : NSError?
do {
var input = try! AVCaptureDeviceInput (device: backCamera)
if (error == nil && captureSession?.canAddInput(input) != nil) {
captureSession?.addInput(input)
stillImageOutput = AVCaptureStillImageOutput()
stillImageOutput?.outputSettings = [AVVideoCodecKey: AVVideoCodecJPEG]
if (captureSession?.canAddOutput(stillImageOutput) != nil) {
captureSession?.addOutput(stillImageOutput)
previewLayer = AVCaptureVideoPreviewLayer (session: captureSession)
previewLayer?.videoGravity = AVLayerVideoGravityResizeAspect
previewLayer?.connection.videoOrientation = AVCaptureVideoOrientation.portrait
cameraView.layer.addSublayer(previewLayer!)
captureSession?.startRunning()
}
}
} catch {
}
}
}
There is my full implementation
I write the objective-c code because Aleksey Timoshchenko answer is correct.
Only for help others.
AVCaptureStillImageOutput
being deprecated means you can keep using it in iOS 10, but:AVCaptureStillImageOutput
for wide color but it's a lot easier to do wide color withAVCapturePhotoOutput
. And for RAW capture or Live Photos,AVCapturePhotoOutput
is the only game in town.If you're happy proceeding despite the deprecation, your issue isn't that
outputSettings
is removed — it's still there.Something to be aware of for beta 6 and beyond (though it turns out not to be an issue here): APIs that use
NSDictionary
without explicit key and value types come into Swift 3 as[AnyHashable: Any]
and the Foundation or CoreFoundation types you might use in a dictionary are no longer implicitly bridged to Swift types. (Some of the other questions about beta 6 dictionary conversions might point you in the right direction there.)However, I'm not getting any compilation errors for setting
outputSettings
. Whether in your full code or by reducing it to the essential parts for that line:...the only warnings I see are about the deprecation.