CameraX 相机加载速度慢

SMG*_*ost 3 android android-camerax

因此,我从使用旧版相机 api 迁移到了 CameraX,尽管设置起来非常简单,但我注意到了一个问题。现在,如果不是比以前更长的时间开始显示预览,相机似乎需要几乎两倍的时间。我正在 Galaxy s7 上进行测试。我的代码如下所示:

val previewConfig = PreviewConfig.Builder().apply {
    setTargetAspectRatio(Rational(1, 1))
    setTargetResolution(Size(binding.codeScannerView.width, binding.codeScannerView.height))
}.build()

val preview = Preview(previewConfig)

preview.setOnPreviewOutputUpdateListener { preview ->
    val parent = binding.codeScannerView.parent as ViewGroup
    parent.removeView(binding.codeScannerView)
    parent.addView(binding.codeScannerView, 0)
    binding.codeScannerView.surfaceTexture = preview.surfaceTexture
}

val analyzerConfig = ImageAnalysisConfig.Builder().apply {
    val analyzerThread = HandlerThread(
            "QrCodeReader").apply { start() }
    setCallbackHandler(Handler(analyzerThread.looper))
    setImageReaderMode(
            ImageAnalysis.ImageReaderMode.ACQUIRE_LATEST_IMAGE)
}.build()

val analyzerUseCase = ImageAnalysis(analyzerConfig).apply {
    analyzer = QrCodeAnalyzer(requireContext(), Handler(), { qrCode ->
        if (activity == null) {
            return@QrCodeAnalyzer
        }
        presenter.disableCameraPreview()
        presenter.updateTable(qrCode.toLowerCase().parseTableId(), isFromOrder, Screens.MENU_SCREEN)
    })
}

CameraX.bindToLifecycle(this, preview, analyzerUseCase)
Run Code Online (Sandbox Code Playgroud)

关于如何使它看起来更快的任何想法?

PS我也可以偶尔在预览中看到撕裂

SMG*_*ost 7

所以我花了很多时间试图找到解决方案,但无济于事。我什至遇到了多个问题(使用 alpha04),例如:

  • 打开/关闭相机时随机 SIGSEGV 崩溃
  • 我尝试了来自 google 的示例项目和代码实验室,它们在经过测试的设备上也没有 100% 的时间工作
  • 在某些时候,我收到通知说相机正在后台使用,即使它绑定到生命周期和窗口关闭,这是我希望我的用户看到的最后一件事。
  • 相机确实加载速度较慢,即使分析仪关闭,我的 FPS 也很糟糕。
  • 分辨率会降到最低,并且在某些设备上预览会像素化
  • 每隔一段时间预览就会开始垂直撕裂
  • 分析器帧的大小与预览不同,并且存在一些纵横比问题需要很长时间才能解决。
  • 它仍然需要一些样板才能工作
  • 边缘情况的文档几乎不存在,所以大部分内容都是反复试验。

最后,我才开始寻找其他库,并找到了https://github.com/natario1/CameraView这是迄今为止我见过的最容易使用的相机库。比camerax更简单,它似乎可以正常工作,加载速度更快,即使分析器步骤在后台运行,也能以高2-3倍的FPS渲染预览。到目前为止,我没有遇到任何问题。

即使我坚信,我在使用 CameraX 时遗漏了一些东西,并且可能有办法让它工作,但最终它现在似乎不值得,我可能会等到有生产就绪版本直到我再试一次。