CapturePhoto не работает быстро 3

Я пытаюсь создать приложение камеры. Поскольку я новичок в iOS, я читаю документацию, смотрю учебники и пишу следующие коды:

import UIKit
import AVFoundation
class StartVC: UIViewController {

var connection: AVCaptureConnection!
var output: AVCapturePhotoOutput!
var videoPreviewLayer: AVCaptureVideoPreviewLayer!
@IBOutlet var videoPreviewView: UIView!

override func viewDidLoad() {
    super.viewDidLoad()

    self.createCamera()
}

override func viewDidLayoutSubviews() {
    super.viewDidLayoutSubviews()

    self.videoPreviewLayer.bounds = self.videoPreviewView.bounds
    self.videoPreviewLayer.position = CGPoint(x: self.videoPreviewView.bounds.midX, y: self.videoPreviewView.bounds.midY)
}

func createCamera() {
    let captureSession = AVCaptureSession()

    if captureSession.canSetSessionPreset(AVCaptureSessionPresetHigh) {
        captureSession.sessionPreset = AVCaptureSessionPresetHigh
    } else {
        print("Error: Couldn't set preset = \(AVCaptureSessionPresetHigh)")
        return
    }

    let cameraDevice = AVCaptureDevice.defaultDevice(withMediaType: AVMediaTypeVideo)

    var error: NSError?

    let inputDevice = try! AVCaptureDeviceInput.init(device: cameraDevice)
    //let inputDevice = AVCaptureDeviceInput.withDevice(cameraDevice) as AVCaptureDeviceInput
    if let error = error {
        print("Error: \(error)")
        return
    }

    if captureSession.canAddInput(inputDevice) {
        captureSession.addInput(inputDevice)
    } else {
        print("Error: Couldn't add input device")
        return
    }

    let imageOutput = AVCapturePhotoOutput()
    if captureSession.canAddOutput(imageOutput) {
        captureSession.addOutput(imageOutput)
    } else {
        print("Error: Couldn't add output")
        return
    }

    // Store imageOutput. We will need it to take photo
    self.output = imageOutput

    let connection = imageOutput.connections.first as! AVCaptureConnection!
    // Store this connection in property. We will need it when we take image.
    self.connection = connection
    connection?.videoOrientation = AVCaptureVideoOrientation.portrait

    captureSession.startRunning()

    // This will preview the camera
    let videoLayer = AVCaptureVideoPreviewLayer(session: captureSession)
    videoLayer?.videoGravity = AVLayerVideoGravityResizeAspectFill
    videoLayer?.contentsScale = UIScreen.main.scale

    self.videoPreviewView.layer.addSublayer(videoLayer!)

    // Store this layer instance in property. We will place it into a view
    self.videoPreviewLayer = videoLayer
}



@IBAction func CaptureButton(_ sender: UIButton) {

    let captureSettings = AVCapturePhotoSettings()
    let previewPixelType = captureSettings.availablePreviewPhotoPixelFormatTypes.first!
    let previewFormat = [kCVPixelBufferPixelFormatTypeKey as String: previewPixelType,
                         kCVPixelBufferWidthKey as String: 300,
                         kCVPixelBufferHeightKey as String: 300,
                         ]
    captureSettings.previewPhotoFormat = previewFormat

    self.output.capturePhoto(with: captureSettings, delegate: self as! AVCapturePhotoCaptureDelegate)

}

}

Но я получаю ошибку в этом разделе.

@IBAction func CaptureButton(_ sender: UIButton) {

    let captureSettings = AVCapturePhotoSettings()
    let previewPixelType = captureSettings.availablePreviewPhotoPixelFormatTypes.first!
    let previewFormat = [kCVPixelBufferPixelFormatTypeKey as String: previewPixelType,
                         kCVPixelBufferWidthKey as String: 300,
                         kCVPixelBufferHeightKey as String: 300,
                         ]
    captureSettings.previewPhotoFormat = previewFormat

// For this line
        self.output.capturePhoto(with: captureSettings, delegate: self as! AVCapturePhotoCaptureDelegate)

    }

Ошибка говорит, что он не мог привести значение myViewController к AVCapturePhotoCaptureDelegate

Как я могу решить эту проблему?

3 ответа

Решение

Попробуй это

class StartVC: UIViewController {
}
extension StartVC: AVCapturePhotoCaptureDelegate{
}

не нужно кастинг

self.output.capturePhoto(with: captureSettings, delegate: self)

Это также можно записать как

class StartVC: UIViewController,AVCapturePhotoCaptureDelegate {


}

Эта ошибка вызвана тем, что вы не подтвердили AVCapturePhotoCaptureDelegate своему viewController, в котором вы написали этот код.

Чтобы устранить эту ошибку, добавьте 'AVCapturePhotoCaptureDelegate' в объявление класса, как показано ниже:

class myViewController: UIViewController,AVCapturePhotoCaptureDelegate{


}

Попробуйте добавить ключ "Конфиденциальность - Описание использования камеры" в info.plist. Если вы используете iOS 10+.

Этот ключ необходим для доступа к камере из нашего приложения.

Другие вопросы по тегам