Xcode 11.2 'imageBuffer' доступен только в iOS 13.0 или новее - PullRequest
0 голосов
/ 09 ноября 2019

Язык: Swift 4.2.

Проблема заключается в требованиях iOS 13.0 для того же кода, который я использовал начиная с iOS 12.0. Та же проблема, что и у многих после обновления Xcode. Ранее установленные macOS Catalina и Xcode 11.2.

Результат: 'imageBuffer' доступен только в iOS 13.0 или новее.

Код (с "@available" перед классом):

import UIKit
import AVKit
import Vision

@available(iOS 13.0, *)
class VideoViewController: UIViewController, AVCaptureVideoDataOutputSampleBufferDelegate
{
    let identifierLabel: UILabel = {
        let label = UILabel()
        label.backgroundColor = .white
        label.textAlignment = .center
        label.translatesAutoresizingMaskIntoConstraints = false
        return label
    }()

    override func viewDidLoad()
    {
        super.viewDidLoad()
        let captureSession = AVCaptureSession()
        captureSession.sessionPreset = .photo

        guard let captureDevice = AVCaptureDevice.default(for: .video) else { return }
        guard let input = try? AVCaptureDeviceInput(device: captureDevice) else { return }
        captureSession.addInput(input)
        captureSession.startRunning()

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

        let dataOutput = AVCaptureVideoDataOutput()
        dataOutput.setSampleBufferDelegate(self, queue: DispatchQueue(label: "videoQueue"))
        captureSession.addOutput(dataOutput)
        setupIdentifierConfidenceLabel()
    }

    fileprivate func setupIdentifierConfidenceLabel() {
        view.addSubview(identifierLabel)
        identifierLabel.bottomAnchor.constraint(equalTo: view.bottomAnchor, constant: -32).isActive = true
        identifierLabel.leftAnchor.constraint(equalTo: view.leftAnchor).isActive = true
        identifierLabel.rightAnchor.constraint(equalTo: view.rightAnchor).isActive = true
        identifierLabel.heightAnchor.constraint(equalToConstant: 50).isActive = true
    }

    func captureOutput(_ output: AVCaptureOutput, didOutput sampleBuffer: CMSampleBuffer, from connection: AVCaptureConnection) {

        //connection.videoOrientation = AVCaptureVideoOrientation.landscapeLeft
        let pixelBuffer: CVPixelBuffer = sampleBuffer.imageBuffer!
        let ciimage : CIImage = CIImage(cvPixelBuffer: pixelBuffer)
        let _ : UIImage = self.convert(cmage: ciimage)

        guard let model = try? VNCoreMLModel(for: FaceClassifier2().model) else { return }
        let request = VNCoreMLRequest(model: model)
        { (finishedReq, err) in

            guard let results = finishedReq.results as? [VNClassificationObservation] else { return }
            guard let firstObservation = results.first else { return }

            print(firstObservation.identifier, firstObservation.confidence)

            DispatchQueue.main.async {
                self.identifierLabel.text = "\(firstObservation.identifier) \(firstObservation.confidence * 100)"
            }

        }

        try? VNImageRequestHandler(cvPixelBuffer: pixelBuffer, options: [:]).perform([request])
    }

    // Convert CIImage to CGImage
    func convert(cmage:CIImage) -> UIImage {
        let context:CIContext = CIContext.init(options: nil)
        let cgImage:CGImage = context.createCGImage(cmage, from: cmage.extent)!
        let image:UIImage = UIImage.init(cgImage: cgImage)
        return image
    }
}

Вопрос: Можно ли сделать этот запуск на iOS 12.0 без @available? Причина в том, что большинство людей до сих пор не могут купить новые айфоны и вообще установить iOS 13.0.

PS: обновления Apple больше не упрощают нашу жизнь.

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