init()在Swift 4中的AVCaptureDeviceInput中不可用

时间:2017-10-01 19:50:29

标签: ios swift4 xcode9 avcapturedevice

我的应用程序中有一个视图控制器,它显示像Snapchat这样的后置摄像头,它在Swift 3中运行良好,但是当我更新到Swift 4时,编译器不会因为以下内容而让我运行它错误:

  

init()不适用于AVCaptureDeviceInput

这个视图控制器应该显示相机没有任何按钮或额外的东西就像Snapchat。所以,这是完整的视图控制器代码:

import UIKit
import AVFoundation

class cameraViewController: UIViewController , UIImagePickerControllerDelegate , UINavigationControllerDelegate {

var captureSession : AVCaptureSession?

var stillImageOutput : AVCaptureStillImageOutput?

var previewLayer : AVCaptureVideoPreviewLayer?

var imagePicker: UIImagePickerController!

@IBOutlet weak var cameraView: UIView!

override func viewDidAppear(_ animated: Bool) {
    super.viewDidAppear(animated)

    previewLayer?.frame = cameraView.bounds
}

override func viewWillAppear(_ animated: Bool) {
    super.viewWillAppear(animated)


    captureSession = AVCaptureSession()

    captureSession?.sessionPreset = AVCaptureSessionPreset1280x720

    let backCamera = AVCaptureDevice.defaultDevice(withMediaType: AVMediaTypeVideo)

    let error : NSError?

    var input = AVCaptureDeviceInput()

    do {
        input = try AVCaptureDeviceInput(device: backCamera)
    }
    catch {
        //  error
    }

    if error == nil && (captureSession?.canAddInput(input))! {

        captureSession?.addInput(input)

        stillImageOutput = AVCaptureStillImageOutput()

        stillImageOutput?.outputSettings = [AVVideoCodecKey : AVVideoCodecJPEG]


        if (captureSession?.canAddOutput(stillImageOutput))! {

            captureSession?.addOutput(stillImageOutput)

            previewLayer = AVCaptureVideoPreviewLayer(session: captureSession)

            previewLayer?.videoGravity = AVLayerVideoGravityResizeAspectFill

            previewLayer?.connection.videoOrientation = AVCaptureVideoOrientation.portrait

            cameraView.layer.addSublayer(previewLayer!)

            captureSession?.startRunning() 

        }
    }

}

}

由于这一行,我无法运行该应用程序:

var input = AVCaptureDeviceInput()

3 个答案:

答案 0 :(得分:1)

在Swift 4中,您必须指定一个设备才能初始化AVCaptureDeviceInput - 实际上,您已经已经初始化,在抛出错误的代码后面有两行。

此外,在此之后,您隐含地在AVCaptureSession声明中展开了另一个安全解包的if

这是你的代码,抛光:

do {
    guard let input = try AVCaptureDeviceInput(device: backCamera),
        captureSession = captureSession else {
        print("Error in initializing a device input")
    }

    if error == nil && (captureSession.canAddInput(input)) {

    [...]
}
catch let error {
    print(error.localizedDescription)
}

答案 1 :(得分:1)

所以我使用了里面的所有左侧代码do catch,我得到了结果,并且应用程序在swift 4中运行良好 - 所以代替查看将出现在我的问题代码中使用下面的代码

 override func viewWillAppear(_ animated: Bool) {
    super.viewWillAppear(animated)


    captureSession = AVCaptureSession()

    captureSession?.sessionPreset = AVCaptureSessionPreset1280x720


    do {
        let input = try AVCaptureDeviceInput(device: .defaultDevice(withMediaType: AVMediaTypeVideo))

        captureSession?.addInput(input)

        stillImageOutput = AVCaptureStillImageOutput()

        stillImageOutput?.outputSettings = [AVVideoCodecKey : AVVideoCodecJPEG]


        if (captureSession?.canAddOutput(stillImageOutput))! {

            captureSession?.addOutput(stillImageOutput)

            previewLayer = AVCaptureVideoPreviewLayer(session: captureSession)

            previewLayer?.videoGravity = AVLayerVideoGravityResizeAspectFill

            previewLayer?.connection.videoOrientation = AVCaptureVideoOrientation.portrait

            cameraView.layer.addSublayer(previewLayer!)

            captureSession?.startRunning()

        }



    } catch {

        print(error)

    }

}

我已经回答了我的问题,以帮助其他人

答案 2 :(得分:0)

你必须使用如下:

if let backCamera = AVCaptureDevice.default(for: .video) {
    do {
        var input = try AVCaptureDeviceInput(device: backCamera)
    } catch {
        //  error
    }
}

如何在您的代码中使用:

override func viewWillAppear(_ animated: Bool) {
    super.viewWillAppear(animated)

    captureSession = AVCaptureSession()
    captureSession?.sessionPreset = AVCaptureSession.Preset.hd1280x720

    guard let backCamera = AVCaptureDevice.default(for: .video) else {
        print("AVCaptureDevice backCamera is nil")
        return
    }

    let error : NSError?

    do {
        let input = try AVCaptureDeviceInput(device: backCamera)

        if (captureSession?.canAddInput(input))! {
            captureSession?.addInput(input)
            stillImageOutput = AVCaptureStillImageOutput()
            stillImageOutput?.outputSettings = [AVVideoCodecKey : AVVideoCodecJPEG]

            if (captureSession?.canAddOutput(stillImageOutput!))! {
                captureSession?.addOutput(stillImageOutput!)
                previewLayer = AVCaptureVideoPreviewLayer(session: captureSession!)
                previewLayer?.videoGravity = AVLayerVideoGravity.resizeAspectFill
                previewLayer?.connection?.videoOrientation = AVCaptureVideoOrientation.portrait
                cameraView.layer.addSublayer(previewLayer!)
                captureSession?.startRunning()
            }
        }
    }
    catch {
        //  error
    }
}