Я получаю сообщение об ошибке «Тема 1: EXC_BREAKPOINT (код = 1, субкод = 0x102d3c320)», как это исправить? - PullRequest
0 голосов
/ 20 марта 2020

Я пытаюсь сделать простой видоискатель видео, следуя документации AVFoundation. Приложение закрывается при каждом запуске. Как мне решить эту конкретную ошибку?

Thread 1: EXC_BREAKPOINT (code=1, subcode=0x102d3c320)

ViewController.swift:

import UIKit

import AVFoundation

class ViewController: UIViewController {

    @IBOutlet weak var toggleCameraButton: NSLayoutConstraint!
    @IBOutlet weak var previewView: PreviewView!

    var captureSession: AVCaptureSession?
    var videoPreviewLayer: AVCaptureVideoPreviewLayer?
    var wideCamera = AVCaptureDevice.default(.builtInWideAngleCamera, for: .video, position: .back)
    var telephotoCamera = AVCaptureDevice.default(.builtInTelephotoCamera, for: .video, position: .back)

    override func viewDidLoad() {
        super.viewDidLoad()
        view.backgroundColor = .black
        captureSession?.beginConfiguration()
        guard
            let wideCameraDeviceInput = try? AVCaptureDeviceInput(device: wideCamera!)
            else { return }

        guard
            let telephotoCameraDeviceInput = try? AVCaptureDeviceInput(device: wideCamera!)
            else { return }
        captureSession?.addInput(wideCameraDeviceInput)
        captureSession?.addInput(telephotoCameraDeviceInput)
        let videoOutput = AVCaptureVideoDataOutput()

        guard 
            (captureSession?.canAddOutput(videoOutput))! //Thread 1: EXC_BREAKPOINT (code=1, subcode=0x102d3c320)
            else { return } 
        captureSession?.sessionPreset = .high
        captureSession?.addOutput(videoOutput)
        captureSession?.commitConfiguration()
        self.previewView.videoPreviewLayer.session = self.captureSession
        captureSession?.startRunning()
    }

    @IBAction func SwitchCameras(_ sender: Any) {
    }

    func switchToTelephoto() {
    }

    func switchToWideAngle() {
    }

}

class PreviewView: UIView {
    override class var layerClass: AnyClass {
        return AVCaptureVideoPreviewLayer.self
    }

    ///Convenience wrapper to get layer as its statically known type.
    var videoPreviewLayer: AVCaptureVideoPreviewLayer {
        return layer as! AVCaptureVideoPreviewLayer
    }

}

отображается только на консоли

(lldb)

1 Ответ

0 голосов
/ 20 марта 2020

Я бы углубился в то, почему вы используете ! в этой строке:

guard (captureSession?.canAddOutput(videoOutput))! else { return } 

Причина, по которой разработчик использует guard, заключается в проверке дополнительных привязок, но вы принудительно разворачиваете дополнительную тем не мение.

Вот как это должно выглядеть (взято из моего проекта, таким образом, проверено и работает)

guard captureSession.canAddOutput(videoOutput) else { return }
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...