Swift中Xcode的Camera App中的初始化错误

时间:2019-01-14 19:05:51

标签: swift initialization avfoundation

我正在使用Swift在Xcode 10.1中构建类似于相机应用程序的应用程序。为此,我导入了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)
        }

出现错误,显示为“无法调用类型为'(session:AVCaptureSession,()->())'的参数列表的类型'AVCaptureVideoPreviewLayer'的初始化程序“

由于我是编程新手,所以我不完全知道这意味着什么或如何解决。

1 个答案:

答案 0 :(得分:0)

您在哪里初始化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
            }
        }
    }

希望对您有帮助!