草庐IT

ios - AVFoundation:在 CanAddInput 处切换相机失败

coder 2023-09-05 原文

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

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

我已经尝试将 sessionPreset(在另一个预先初始化 session 的函数中)设置为各种值,包括 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!")
            }
        }
    }
}

最佳答案

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

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

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

为了将所有这些喋喋不休的代码整理成代码,我是这样做的:

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

这就成功了! :)

关于ios - AVFoundation:在 CanAddInput 处切换相机失败,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/30755043/

有关ios - AVFoundation:在 CanAddInput 处切换相机失败的更多相关文章

  1. ruby-on-rails - Ruby on Rails with Haml - 如何从 erb 切换 - 2

    我正在从erb文件切换到HAML。我将hamlgem添加到我的系统中。我创建了app/views/layouts/application.html.haml文件。我应该只删除application.html.erb文件吗?此外,仍然有/public/index.html文件被呈现为默认页面。我想创建自己的默认index.html.haml页面。我应该把它放在哪里以及如何使系统呈现该文件而不是默认索引文件?谢谢! 最佳答案 是的,您可以删除任何已转换为HAML的View的ERB版本。至于你的另一个问题,删除public/index/h

  2. ruby - 即使失败也继续进行多主机测试 - 2

    我已经构建了一些serverspec代码来在多个主机上运行一组测试。问题是当任何测试失败时,测试会在当前主机停止。即使测试失败,我也希望它继续在所有主机上运行。Rakefile:namespace:specdotask:all=>hosts.map{|h|'spec:'+h.split('.')[0]}hosts.eachdo|host|begindesc"Runserverspecto#{host}"RSpec::Core::RakeTask.new(host)do|t|ENV['TARGET_HOST']=hostt.pattern="spec/cfengine3/*_spec.r

  3. ruby - 如何验证 IO.copy_stream 是否成功 - 2

    这里有一个很好的答案解释了如何在Ruby中下载文件而不将其加载到内存中:https://stackoverflow.com/a/29743394/4852737require'open-uri'download=open('http://example.com/image.png')IO.copy_stream(download,'~/image.png')我如何验证下载文件的IO.copy_stream调用是否真的成功——这意味着下载的文件与我打算下载的文件完全相同,而不是下载一半的损坏文件?documentation说IO.copy_stream返回它复制的字节数,但是当我还没有下

  4. Ruby 文件 IO 定界符? - 2

    我正在尝试解析一个文本文件,该文件每行包含可变数量的单词和数字,如下所示:foo4.500bar3.001.33foobar如何读取由空格而不是换行符分隔的文件?有什么方法可以设置File("file.txt").foreach方法以使用空格而不是换行符作为分隔符? 最佳答案 接受的答案将slurp文件,这可能是大文本文件的问题。更好的解决方案是IO.foreach.它是惯用的,将按字符流式传输文件:File.foreach(filename,""){|string|putsstring}包含“thisisanexample”结果的

  5. Get https://registry-1.docker.io/v2/: net/http: request canceled while waiting - 2

    1.错误信息:Errorresponsefromdaemon:Gethttps://registry-1.docker.io/v2/:net/http:requestcanceledwhilewaitingforconnection(Client.Timeoutexceededwhileawaitingheaders)或者:Errorresponsefromdaemon:Gethttps://registry-1.docker.io/v2/:net/http:TLShandshaketimeout2.报错原因:docker使用的镜像网址默认为国外,下载容易超时,需要修改成国内镜像地址(首先阿里

  6. ruby-on-rails - 创建 ruby​​ 数据库时惰性符号绑定(bind)失败 - 2

    我正在尝试在Rails上安装ruby​​,到目前为止一切都已安装,但是当我尝试使用rakedb:create创建数据库时,我收到一个奇怪的错误:dyld:lazysymbolbindingfailed:Symbolnotfound:_mysql_get_client_infoReferencedfrom:/Library/Ruby/Gems/1.8/gems/mysql2-0.3.11/lib/mysql2/mysql2.bundleExpectedin:flatnamespacedyld:Symbolnotfound:_mysql_get_client_infoReferencedf

  7. [工业相机] 分辨率、精度和公差之间的关系 - 2

    📢博客主页:https://blog.csdn.net/weixin_43197380📢欢迎点赞👍收藏⭐留言📝如有错误敬请指正!📢本文由Loewen丶原创,首发于CSDN,转载注明出处🙉📢现在的付出,都会是一种沉淀,只为让你成为更好的人✨文章预览:一.分辨率(Resolution)1、工业相机的分辨率是如何定义的?2、工业相机的分辨率是如何选择的?二.精度(Accuracy)1、像素精度(PixelAccuracy)2、定位精度和重复定位精度(RepeatPrecision)三.公差(Tolerance)四.课后作业(Post-ClassExercises)视觉行业的初学者,甚至是做了1~2年

  8. ruby - 正则表达式在哪个位置失败? - 2

    我需要一个非常简单的字符串验证器来显示第一个符号与所需格式不对应的位置。我想使用正则表达式,但在这种情况下,我必须找到与表达式相对应的字符串停止的位置,但我找不到可以做到这一点的方法。(这一定是一种相当简单的方法……也许没有?)例如,如果我有正则表达式:/^Q+E+R+$/带字符串:"QQQQEEE2ER"期望的结果应该是7 最佳答案 一个想法:你可以做的是标记你的模式并用可选的嵌套捕获组编写它:^(Q+(E+(R+($)?)?)?)?然后你只需要计算你获得的捕获组的数量就可以知道正则表达式引擎在模式中停止的位置,你可以确定匹配结束

  9. ruby - 使用 rbenv 和 ruby​​-build 构建 ruby​​ 失败,出现 undefined symbol : SSLv2_method - 2

    我正在尝试在配备ARMv7处理器的SynologyDS215j上安装ruby​​2.2.4或2.3.0。我用了optware-ng安装gcc、make、openssl、openssl-dev和zlib。我根据README中的说明安装了rbenv(版本1.0.0-19-g29b4da7)和ruby​​-build插件。.这些是随optware-ng安装的软件包及其版本binutils-2.25.1-1gcc-5.3.0-6gconv-modules-2.21-3glibc-opt-2.21-4libc-dev-2.21-1libgmp-6.0.0a-1libmpc-1.0.2-1libm

  10. ruby-on-rails - Ruby 的 'open_uri' 是否在读取或失败后可靠地关闭套接字? - 2

    一段时间以来,我一直在使用open_uri下拉ftp路径作为数据源,但突然发现我几乎连续不断地收到“530抱歉,允许的最大客户端数(95)已经连接。”我不确定我的代码是否有问题,或者是否是其他人在访问服务器,不幸的是,我无法真正确定谁有问题。本质上,我正在读取FTPURI:defself.read_uri(uri)beginuri=open(uri).readuri=="Error"?nil:urirescueOpenURI::HTTPErrornilendend我猜我需要在这里添加一些额外的错误处理代码...我想确保我采取一切预防措施来关闭所有连接,这样我的连接就不是问题所在,但是我

随机推荐