Привет, я видел пару сообщений с этой проблемой, но не касался простого .jpg или решения, которое я уже реализовал в своем коде. Я не сохраняю значение изображения, но просто пытаюсь заставить работать камеру. Я запускаю это самостоятельно iPhone, и камера работает нормально, но когда я нажимаю кнопку «Сделать фото», появляется ошибка:
stillImageOutput.capturePhoto(with: settings, delegate: self)
Вот ошибка: *** Завершение работы приложения из-за неперехваченного исключения «NSInvalidArgumentException», причина: «*** - [AVCapturePhotoOutput capturePhotoWithSettings: delegate:] Нет активного и включенного видеоподключения»
Вот полный объем кода:
import UIKit
import AVFoundation
class CameraViewController: UIViewController, UINavigationControllerDelegate, AVCapturePhotoCaptureDelegate {
@IBOutlet weak var previewView: UIView!
@IBOutlet weak var takePhotoButton: UIButton!
@IBOutlet weak var cancelButton: UIButton!
var captureSession: AVCaptureSession!
var stillImageOutput: AVCapturePhotoOutput!
var videoPreviewLayer: AVCaptureVideoPreviewLayer!
override func viewDidLoad() {
super.viewDidLoad()
takePhotoButton.backgroundColor = .blue
cancelButton.backgroundColor = .gray
}
override func viewDidAppear(_ animated: Bool) {
super.viewDidAppear(animated)
// Setup your camera here...
captureSession = AVCaptureSession()
captureSession.sessionPreset = .medium
//captureSession.sessionPreset = AVCaptureSession.Preset.high
guard let backCamera = AVCaptureDevice.default(for: AVMediaType.video)
else {
print("Unable to access back camera!")
return
}
do {
let input = try AVCaptureDeviceInput(device: backCamera)
stillImageOutput = AVCapturePhotoOutput()
if captureSession.canAddInput(input) && captureSession.canAddOutput(stillImageOutput) {
captureSession.addInput(input)
captureSession.addOutput(stillImageOutput)
setupLivePreview()
}
}
catch let error {
print("Error Unable to initialize back camera: \(error.localizedDescription)")
}
stillImageOutput = AVCapturePhotoOutput()
DispatchQueue.global(qos: .userInitiated).async { //[weak self] in
self.captureSession.startRunning()
}
DispatchQueue.main.async {
self.videoPreviewLayer.frame = self.previewView.bounds
}
}
override func viewWillDisappear(_ animated: Bool) {
super.viewWillDisappear(animated)
self.captureSession.stopRunning()
}
func transistionToHome(){
let homeViewController = storyboard?.instantiateViewController(identifier: Constants.Storyboard.homeViewController) as?
HomeViewController
view.window?.rootViewController = homeViewController
view.window?.makeKeyAndVisible()
}
func setupLivePreview() {
videoPreviewLayer = AVCaptureVideoPreviewLayer(session: captureSession)
videoPreviewLayer.videoGravity = .resizeAspect
videoPreviewLayer.connection?.videoOrientation = .portrait
previewView.layer.addSublayer(videoPreviewLayer)
}
@IBAction func didTakePhoto(_ sender: Any) {
let settings = AVCapturePhotoSettings(format: [AVVideoCodecKey: AVVideoCodecType.jpeg])
stillImageOutput.capturePhoto(with: settings, delegate: self)
}
@IBAction func cancelPressed(_ sender: Any) {
// for now transition to home eventually be a pdf viewser where user can select
// to confirm upload of docs or cancel upload
transistionToHome()
}
}