相机冻结启动情感探测器

时间:2017-11-11 20:53:15

标签: ios swift avcapturedevice affdex-sdk

嘿我正在使用Affectiva Affdex ios SDK。现在我有2个观点。

  1. UIView - >我在哪里运行相机流。相同的代码在这里:

    func allConfig(withCamView cams:UIView) {
    
    let captureDevice = AVCaptureDeviceDiscoverySession(deviceTypes: [.builtInDualCamera, .builtInWideAngleCamera], mediaType: AVMediaTypeVideo, position: .unspecified)
    
    for device in (captureDevice?.devices)! {
    
        if device.position == .front{
    
            do {
                let input = try AVCaptureDeviceInput(device: device)
    
                if session.canAddInput(input) {
                    session.addInput(input)
                }
    
                if session.canAddOutput(previewOutput) {
                    session.addOutput(previewOutput)
                }
    
                previewLayer = AVCaptureVideoPreviewLayer(session: session)
                previewLayer.videoGravity = AVLayerVideoGravityResizeAspectFill
                previewLayer.connection.videoOrientation = .portrait
    
                cams.layer.addSublayer(previewLayer)
    
                previewLayer.position = CGPoint(x: cams.frame.width/2, y: cams.frame.height/2)
                previewLayer.bounds = cams.frame
    
    
                session.startRunning()
    
    
            } catch let avError {
                print(avError)
            }
        }
    }
    
    }
    
  2. 另一个UICollectionView Cell,我正在启动一个探测器。代码就在这里:

     func createDetector() {
    destroyDetector()
    let captureDevice = AVCaptureDeviceDiscoverySession(deviceTypes: [.builtInDualCamera, .builtInWideAngleCamera], mediaType: AVMediaTypeVideo, position: .unspecified)
    for device in (captureDevice?.devices)! {
    
        if device.position == .front{
            EMDetector = AFDXDetector(delegate: self, using: device, maximumFaces: 2, face: LARGE_FACES)
            EMDetector.maxProcessRate = 5
    
            // turn on all classifiers (emotions, expressions, and emojis)
            EMDetector.setDetectAllExpressions(true)
            EMDetector.setDetectAllEmotions(true)
            EMDetector.setDetectAllAppearances(true)
            EMDetector.setDetectEmojis(true)
    
            // turn on gender and glasses
            EMDetector.gender = true
            EMDetector.glasses = true
    
    
    
            // start the detector and check for failure
            let error: Error? = EMDetector.start()
            if nil != error {
                print("Some Faliure in detector")
                print("root cause of error ------------------------- > \(error.debugDescription)")
            }
        }
    }
    
    }
    
  3. 这些视图占用50-50个屏幕空间。

    问题:

    每当我尝试运行应用程序时,相机流会在一秒钟后冻结。那是因为探测器启动了。 现在,如果您在那里检查github示例应用程序(https://github.com/Affectiva/affdexme-ios/tree/master/apps/AffdexMe),也可以在应用程序商店中找到。即使他们正在检测情绪,相机视图仍然打开。

    我甚至尝试合并2个函数然后调用函数,但不知何故,一个函数取消了另一个函数。

    这是怎么回事?

    由于

1 个答案:

答案 0 :(得分:1)

问题是您正在为第一个视图创建捕获会话,而SDK会创建另一个会话来处理相机输入。您不能同时运行多个会话。

解决此问题的一种方法是在两个视图中使用从委托方法func detector(_ detector: AFDXDetector!, hasResults faces: NSMutableDictionary!, for image: UIImage!, atTime time: TimeInterval)返回的图像。

另一种方法是创建相机会话,然后自己将图像传递给检测器。

  1. 像这样初始化你的探测器

    EMDetector = AFDXDetector(delegate: self, discreteImages: false, maximumFaces: 2, face: LARGE_FACES)

  2. 然后使用

    将捕获会话中的图像传递给检测器

    EMDetector.processImage(UIImage!, atTime: TimeInterval)