【问题标题】:AVFoundation: toggle camera fails at CanAddInputAVFoundation:在 CanAddInput 处切换相机失败
【发布时间】:2015-06-10 11:32:29
【问题描述】:

我正在尝试使用AVFoundation 添加旋转摄像头功能,以允许用户在前置摄像头和后置摄像头之间切换。

如下面的代码所示,我已经放入了一些println() 语句,所有值看起来都是合法的,但是在测试CanAddInput() 时代码总是落到失败的else 子句中。

我尝试将 sessionPreset(在另一个预先初始化会话的函数中)设置为各种值,包括 AVCaptureSessionPresetHighAVCaptureSessionPresetLow,但这没有帮助。

@IBAction func rotateCameraPressed(sender: AnyObject) {

    // Loop through all the capture devices to find right ones
    var backCameraDevice : AVCaptureDevice?
    var frontCameraDevice : AVCaptureDevice?
    let devices = AVCaptureDevice.devices()
    for device in devices {
        // Make sure this particular device supports video
        if (device.hasMediaType(AVMediaTypeVideo)) {
            // Define devices
            if (device.position == AVCaptureDevicePosition.Back) {
                backCameraDevice = device as? AVCaptureDevice
            } else if (device.position == AVCaptureDevicePosition.Front) {
                frontCameraDevice = device as? AVCaptureDevice
            }
        }
    }

    // Assign found devices to corresponding input
    var backInput : AVCaptureDeviceInput?
    var frontInput : AVCaptureDeviceInput?
    var error: NSError?
    if let backDevice = backCameraDevice {
        println("Back device is \(backDevice)")
        backInput = AVCaptureDeviceInput(device : backDevice, error: &error)
    }
    if let frontDevice = frontCameraDevice {
        println("Front device is \(frontDevice)")
        frontInput = AVCaptureDeviceInput(device : frontDevice, error: &error)
    }

    // Now rotate the camera
    isBackCamera = !isBackCamera  // toggle camera position
    if isBackCamera {
        // remove front and add back
        captureSession!.removeInput(frontInput)
        if let bi = backInput {
            println("Back input is \(bi)")
            if captureSession!.canAddInput(bi) {
                captureSession!.addInput(bi)
            } else {
                println("Cannot add back input!")
            }
        }
    } else {
        // remove back and add front
        captureSession!.removeInput(backInput)
        if let fi = frontInput {
            println("Front input is \(fi)")
            if captureSession!.canAddInput(fi) {
                captureSession!.addInput(fi)
            } else {
                println("Cannot add front input!")
            }
        }
    }
}

【问题讨论】:

    标签: ios swift camera toggle avfoundation


    【解决方案1】:

    问题似乎在于迭代中发现的设备的派生输入实际上与 captureSession 变量中的输入不匹配。这似乎是一个新事物,因为我看到的所有关于此的代码都会通过遍历设备列表来查找并删除当前相机的输入,就像我在代码中所做的那样。

    这似乎不再起作用 - 好吧,至少在我发布的代码中没有,这是基于我能够挖掘的所有资源(所有这些都恰好在 Objective C 中)。 canAddInput() 失败的原因是 removeInput() 永远不会成功;它不会发出关于无法拥有多个输入设备的常见错误这一事实很奇怪(因为它有助于调试)。

    无论如何,解决方法是不从找到的设备(过去可以工作)中删除派生输入上的输入。相反,通过进入 captureSession.inputs 变量并对其执行 removeInput() 来移除实际存在的输入设备。

    为了将所有乱七八糟的内容整理成代码,这就是我所做的:

    for ii in captureSession!.inputs {
      captureSession!.removeInput(ii as! AVCaptureInput)
    }
    

    这就成功了! :)

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多