Как отправить сообщение из captureOutput другому контроллеру uiview - PullRequest
0 голосов
/ 05 июня 2019

Я пытаюсь сделать «мигающий» захват, который привлечет внимание пользователя и что-то с ним сделает. Мне удается видеть и видеть, когда пользователь моргает, но мне не удалось отправить сообщение между двумя классами. Класс 1 фиксирует, что произошло мигание, и класс 2 должен получить сообщение и выполнить операцию. В классе 1 я снимаю видео в реальном времени и анализирую результат, который мне нужно отправить в класс 2:

класс 1:

import AVFoundation

class SessionHandler : NSObject,
AVCaptureVideoDataOutputSampleBufferDelegate,
AVCaptureMetadataOutputObjectsDelegate {
var session = AVCaptureSession()
let layer = AVSampleBufferDisplayLayer()
let sampleQueue = DispatchQueue(label:
"com.zweigraf.DisplayLiveSamples.sampleQueue", attributes: [])
let faceQueue = DispatchQueue(label:
"com.zweigraf.DisplayLiveSamples.faceQueue", attributes: [])
let wrapper = DlibWrapper()
var message : DarwinBoolean!
var currentMetadata: [AnyObject]
var count = 0
override init() {
    currentMetadata = []
    //message = false
    super.init()
}

func openSession() {
    self.message = false
    let device = AVCaptureDevice.devices(for: AVMediaType.video)
        .map { $0 }
        .filter { $0.position == .front}
        .first!

    let input = try! AVCaptureDeviceInput(device: device)

    let output = AVCaptureVideoDataOutput()
    output.setSampleBufferDelegate(self, queue: sampleQueue)

    let metaOutput = AVCaptureMetadataOutput()
    metaOutput.setMetadataObjectsDelegate(self, queue: faceQueue)

    session.beginConfiguration()

    if session.canAddInput(input) {
        session.addInput(input)
    }
    if session.canAddOutput(output) {
        session.addOutput(output)
    }
    if session.canAddOutput(metaOutput) {
        session.addOutput(metaOutput)
    }

    session.commitConfiguration()

    let settings: [AnyHashable: Any] =
[kCVPixelBufferPixelFormatTypeKey as AnyHashable:
Int(kCVPixelFormatType_32BGRA)]
    output.videoSettings = settings as! [String : Any]
           metaOutput.metadataObjectTypes = 
[AVMetadataObject.ObjectType.face]

    wrapper?.prepare()

    session.startRunning()
}

// MARK: AVCaptureVideoDataOutputSampleBufferDelegate
func captureOutput(_ output: AVCaptureOutput, didOutput
sampleBuffer: CMSampleBuffer, from connection: AVCaptureConnection
{

    if !currentMetadata.isEmpty {
        let boundsArray = currentMetadata
            .compactMap { $0 as? AVMetadataFaceObject }
            .map { (faceObject) -> NSValue in
                let convertedObject =
output.transformedMetadataObject(for: faceObject, connection:
connection)
                return NSValue(cgRect: convertedObject!.bounds)
        }

        wrapper?.doWork(on: sampleBuffer, inRects: boundsArray,
message: &message)
        if(message == true){
            count += 1
            if(count >= 4){
                //send message here 
            }
        }
        else{
            count = 0
        }

    }

    layer.enqueue(sampleBuffer)
}

func captureOutput(_ output: AVCaptureOutput, didDrop sampleBuffer:
CMSampleBuffer, from connection: AVCaptureConnection) {
    connection.videoOrientation =
AVCaptureVideoOrientation.portrait
    print("DidDropSampleBuffer")
}

// MARK: AVCaptureMetadataOutputObjectsDelegate

func metadataOutput(_ output: AVCaptureMetadataOutput, didOutput
metadataObjects: [AVMetadataObject], from connection:
AVCaptureConnection) {
    currentMetadata = metadataObjects as [AnyObject]
}
}

класс 2:

import UIKit
import AVFoundation

class DlibSwift: UIViewController {
let sessionHandler = SessionHandler()
var message : DarwinBoolean!

@IBOutlet weak var preview: UIView!

override func viewDidLoad() {
    super.viewDidLoad()
    // Do any additional setup after loading the view, typically
from a nib.
}

override func didReceiveMemoryWarning() {
    super.didReceiveMemoryWarning()
    // Dispose of any resources that can be recreated.
}

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

    sessionHandler.openSession()


    let layer = sessionHandler.layer
    layer.frame = preview.bounds
    preview.layer.addSublayer(layer)
    view.layoutIfNeeded()

}

}

Я пытаюсь искать в Интернете, но безуспешно. Я попробовал @escaping, но видео не появилось. Я действительно потерян

...