Нет активного и включенного видеосоединения, хотя потоковая передача выполняется на устройстве iOS - PullRequest
0 голосов
/ 11 июля 2020

Привет, я видел пару сообщений с этой проблемой, но не касался простого .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()
    }
}
...