Ошибка инициализатора в приложении камеры для Xcode в Swift - PullRequest
0 голосов
/ 14 января 2019

Я создаю приложение, похожее на приложение камеры в Xcode 10.1, используя Swift. Для этого я импортировал AVFoundation, и я близок к завершению моего кода. Тем не менее, на этой строке кода

     let previewLayer = AVCaptureVideoPreviewLayer(session: captureSession)

который находится в этом блоке кода

func beginSession () {
    do {
        let captureDeviceInput = try AVCaptureDeviceInput( device: captureDevice!)

        captureSession.addInput(captureDeviceInput)
    } catch {
        print(error.localizedDescription)
    }

    let previewLayer = AVCaptureVideoPreviewLayer(session: captureSession) {
        self.previewLayer = self.previewLayer
        self.view.layer.addSublayer(self.previewLayer)
        self.previewLayer.frame = self.view.layer.frame
        captureSession.startRunning()

        let dataOutput = AVCaptureVideoDataOutput()
        dataOutput.videoSettings = [(kCVPixelBufferPixelFormatTypeKey as NSString): NSNumber(value: kCVPixelFormatType_32BGRA)] as [String : Any]

        dataOutput.alwaysDiscardsLateVideoFrames = true

        if captureSession.canAddOutput(dataOutput) {
            captureSession.addOutput(dataOutput)
        }

Появляется ошибка, которая гласит: «Невозможно вызвать инициализатор для типа 'AVCaptureVideoPreviewLayer' со списком аргументов типа '(session: AVCaptureSession, () -> ())'"

Я точно не знаю, что это значит или как это исправить, поскольку я относительно новичок в программировании.

1 Ответ

0 голосов
/ 14 января 2019

Где вы инициализировали captureSession?

Попробуйте что-то вроде этого в вашем UIViewController:

    var captureSession = AVCaptureSession()
    var videoPreviewLayer: AVCaptureVideoPreviewLayer?

    override func viewDidLoad() {
        super.viewDidLoad()

        beginSession()
    }

    func beginSession() {

        // Get an instance of the AVCaptureDevice class to initialize a device object and provide the video as the media type parameter.
        if let captureDevice = AVCaptureDevice.default(for: AVMediaType.video) {

            do {
                // Get an instance of the AVCaptureDeviceInput class using the previous device object.
                let input = try AVCaptureDeviceInput(device: captureDevice)

                // Set the input device on the capture session.
                captureSession.addInput(input)

                // Initialize a AVCaptureVideoDataOutput object and set it as the output device to the capture session.
                let dataOutput = AVCaptureVideoDataOutput()
                dataOutput.videoSettings = [(kCVPixelBufferPixelFormatTypeKey as NSString): NSNumber(value: kCVPixelFormatType_32BGRA)] as [String : Any]

                dataOutput.alwaysDiscardsLateVideoFrames = true

                if captureSession.canAddOutput(dataOutput) {
                    captureSession.addOutput(dataOutput)
                }

                // Initialize the video preview layer and add it as a sublayer to the viewPreview view's layer.
                videoPreviewLayer = AVCaptureVideoPreviewLayer(session: captureSession)
                videoPreviewLayer?.videoGravity = AVLayerVideoGravity.resizeAspectFill
                videoPreviewLayer?.frame = self.view.layer.bounds // It may be best to setup an UIView outlet instead of using self.view
                self.view.layer.addSublayer(videoPreviewLayer!) 

                // Start video capture.
                captureSession.startRunning()

            } catch {
                // If any error occurs, simply print it out and don't continue any more.
                print(error)
                return
            }
        }
    }

Надеюсь, это поможет вам!

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...