我的应用程序中有一个视图控制器,它显示像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()
答案 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
}
}