ios – AVFoundation:切换相机在CanAddInput失败

ios – AVFoundation:切换相机在CanAddInput失败,第1张

概述我正在尝试使用AVFoundation添加旋转相机功能,以允许用户在前置摄像头和后置摄像头之间切换. 如下面的代码所示,我已经放入了一些println()语句,并且所有值看似合法,但在测试CanAddInput()时,代码总是会丢失到失败的else子句. 我已经尝试将sessionPreset(在另一个事先初始化会话的函数中)设置为各种值,包括AVCaptureSessionPresetHigh和 我正在尝试使用AVFoundation添加旋转相机功能,以允许用户在前置摄像头和后置摄像头之间切换.

如下面的代码所示,我已经放入了一些println()语句,并且所有值看似合法,但在测试CanAddinput()时,代码总是会丢失到失败的else子句.

我已经尝试将sessionPreset(在另一个事先初始化会话的函数中)设置为各种值,包括AVCaptureSessionPresetHigh和AVCaptureSessionPresetLow,但这没有帮助.

@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!")            }        }    }}
解决方法 问题似乎是迭代中找到的设备的派生输入实际上与captureSession变量中的输入不匹配.这似乎是一个新事物,因为我看到的所有代码都会通过遍历设备列表找到并删除当前相机的输入,就像我在我的代码中所做的那样.

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

无论如何,修复是不从已找到的设备(以前的工作)中删除派生输入的输入.相反,通过进入captureSession.inputs变量并对其执行removeinput()来删除实际存在的输入设备.

为了扼杀所有唠叨的代码,这就是我所做的:

for ii in captureSession!.inputs {  captureSession!.removeinput(ii as! AVCaptureinput)}

这就是诀窍! 总结

以上是内存溢出为你收集整理的ios – AVFoundation:切换相机在CanAddInput失败全部内容,希望文章能够帮你解决ios – AVFoundation:切换相机在CanAddInput失败所遇到的程序开发问题。

如果觉得内存溢出网站内容还不错,欢迎将内存溢出网站推荐给程序员好友。

欢迎分享,转载请注明来源:内存溢出

原文地址: http://outofmemory.cn/web/1072799.html

(0)
打赏 微信扫一扫 微信扫一扫 支付宝扫一扫 支付宝扫一扫
上一篇 2022-05-26
下一篇 2022-05-26

发表评论

登录后才能评论

评论列表(0条)

保存