Я пытаюсь сделать «мигающий» захват, который привлечет внимание пользователя и что-то с ним сделает. Мне удается видеть и видеть, когда пользователь моргает, но мне не удалось отправить сообщение между двумя классами. Класс 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, но видео не появилось. Я действительно потерян