【问题标题】:How to get available resolutions using CameraX on Android?如何在 Android 上使用 CameraX 获取可用分辨率?
【发布时间】:2021-09-21 00:27:03
【问题描述】:

有没有办法使用CameraX 查询可用的相机分辨率?使用Camera2 可以使用StreamConfigurationMap.getOutputSizes()。但是,我找不到使用CameraX 的方法。

documentation 已经过时了。目前它引用版本1.0.0-alpha06,并且许多API在最新的1.0.0-beta01中发生了变化。

编辑:

有一种方法可以使用Camera2 API 获得可用的分辨率(感谢以下 Wasim 的回答)。但是,这只有在相机绑定到生命周期后才有可能,因此无法再更改目标分辨率,这使得它非常无用。

当然,我可以在不知道可用分辨率的情况下指定目标分辨率,但这样我就无法控制生成的纵横比。在我的情况下,我最终得到 16:9 Preview 和 4:3 ImageAnalysis,尽管我的 ImageAnalysistargetResolution 是 16:9 (224x126)。

为了记录,这是您获得输出大小的方式:

val camera = cameraProvider.bindToLifecycle(this, cameraSelector, preview, imageAnalyzer)
val cameraId = Camera2CameraInfo.extractCameraId(camera.cameraInfo)
val cameraManager = context.getSystemService(Context.CAMERA_SERVICE) as CameraManager
val characteristics = cameraManager.getCameraCharacteristics(cameraId)
val streamConfigurationMap = characteristics.get(CameraCharacteristics.SCALER_STREAM_CONFIGURATION_MAP)
val outputSizes = streamConfigurationMap.getOutputSizes(format)

仍在寻找实际的解决方案。提前致谢。

【问题讨论】:

  • 未解决的参考:extractCameraId ...您是如何导入“Camera2CameraInfo”类的?
  • 您好,您的问题解决了吗?谢谢!
  • @ch271828n 不,我最终改用了 Camera2。不过从那时起已经两年了,我已经很长时间没有从事那个项目了,所以现在也许有了 CameraX 更好的解决方案。

标签: android android-camerax


【解决方案1】:

这可以帮助任何在这里搜索的人。

Android CameraX,获取CameraCharacteristics.LENS_INFO_MINIMUM_FOCUS_DISTANCE等相机特征。

对于 2021 年,语法类似于 ...

所以,你已经完成了获取相机的过程......

theCamera = cameraProvider.bindToLifecycle((LifecycleOwner)this,
              yourCameraSelector, yourImageAnalysis, yourPreview);

现在的代码是:

CameraCharacteristics camChars = Camera2CameraInfo
   .extractCameraCharacteristics(theCamera.getCameraInfo());
float discoveredMinFocusDistance = camChars
   .get(CameraCharacteristics.LENS_INFO_MINIMUM_FOCUS_DISTANCE);

你可能需要一个

@SuppressLint("UnsafeExperimentalUsageError")
CameraCharacteristics camChars =  ...

第一行。

【讨论】:

  • 你也能得到可用的分辨率吗?看起来这不是CameraCharacteristics 的一部分,对吧?
  • 嗨@Georgios - 恐怕我不知道:/恐怕我目前的斗争是这样的:stackoverflow.com/questions/66602624
【解决方案2】:

This 为我工作:

val camera = cameraProvider.bindToLifecycle(mainActivity, cameraSelector, CameraManager.imageAnalysis)

val cameraId = Camera2CameraInfo.from(camera.cameraInfo).cameraId
val cameraManager = context.getSystemService(Context.CAMERA_SERVICE) as CameraManager
val characteristics = cameraManager.getCameraCharacteristics(cameraId)
val configs: StreamConfigurationMap? = characteristics.get(CameraCharacteristics.SCALER_STREAM_CONFIGURATION_MAP)

val imageAnalysisSizes = configs?.getOutputSizes(ImageFormat.YUV_420_888)
imageAnalysisSizes?.forEach {
    Log.i("LOG", "Image capturing YUV_420_888 available output size: $it")
}

val previewSizes = configs?.getOutputSizes(SurfaceTexture::class.java)
previewSizes?.forEach {
    Log.i("LOG", "Preview available output size: $it")
}

【讨论】:

  • 嗨,我想知道如何在 before bindToLifecycle 之前获得分辨率?即当做ImageCapture.Builder().setCaptureResolution?
【解决方案3】:

即使在 CameraX 中,您也始终可以使用 camera2 api StreamConfigurationMap.getOutputSizes() 来获得支持的分辨率。由于 CameraX 是在 camera2 之上构建的,所以这无关紧要。

如果您想知道 camerax 支持什么分辨率,没有任何 API。 但是您始终可以设置您选择的分辨率,cameraX 会负责将其缩放到最接近的支持分辨率。

【讨论】:

  • 感谢您的回答。你说得对,我可以使用StreamConfigurationMap.getOutputSizes(),但为了获得StreamConfigurationMap,我首先需要获得CameraCharacteristics 的实例,为此我需要知道cameraId,它仅在ProcessCameraProvider.bindToLifecycle(...) 之后可用.此时相机已经配置好了,我不能再改变目标分辨率了。
  • 关于设置我选择的分辨率,这里的问题是我无法控制纵横比。例如,我经常将目标分辨率设置为 224x126 (16:9),结果是 4:3,而不是最接近我的目标的 16:9。当你最终得到 16:9 Preview 但 4:3 ImageAnalysis 时,这尤其麻烦,这就是我的情况。
猜你喜欢
  • 1970-01-01
  • 2014-01-13
  • 1970-01-01
  • 1970-01-01
  • 2016-04-18
  • 2010-12-03
  • 2011-04-13
相关资源
最近更新 更多