gpt4 book ai didi

android - Camera2 在 Android API 29 中用两个物理流替换一个逻辑流

转载 作者:行者123 更新时间:2023-11-29 00:54:27 26 4
gpt4 key购买 nike

当Android 9(API 28)发布时,我很高兴地发现多摄像头手机的物理摄像头会暴露,我一直很沮丧无法访问它们。今天我偶然发现了android Q documentation其中说:

Starting from API level 29, some or all physical cameras may not be independently exposed to the application, in which case the physical camera IDs will not be available in CameraManager.getCameraIdList(). But the application can still query the physical cameras' characteristics by calling CameraManager.getCameraCharacteristics(String).

这个说法让我很疑惑,是不是意味着Android在回溯?改变的目的是什么?

我对在非常精细的水平上管理相机很感兴趣,这一变化是否会阻止我使用 Android 9 做我现在能够做的事情?

上面说ID可以不列出来了,但是特征还是可以查询的,没有ID怎么获取相机的特征呢?我想我们应该通过 getPhysicalCameraIds() 在逻辑相机上获取物理相机的 ID,但这是否意味着如果我们想使用“隐藏”相机,我们必须测试一个一堆随机 ID 字符串?

enter image description here

我们仍然能够使用 SessionConfiguration 创建捕获 session 吗?在未曝光的物理相机上?

有人可以阐明这一点吗?

最佳答案

我尝试使用 Pixel 5 (Android 11) 的第一个逻辑后置摄像头的物理 ID 打开摄像头,但失败并显示错误:未知摄像头 ID....

因此 Pixel 5 仅返回 2 个逻辑摄像头 ID,并且只有这 2 个摄像头可以使用 cameraManager.openCamera(...) 方法打开...

Samsung S10(也是 Android 11)返回 4 个逻辑相机 ID,并且没有所有这些逻辑相机的任何物理相机 ID,所有 4 个相机都可以毫无问题地使用。

Pixel 5 相机信息:

enter image description here

三星 S10 相机信息:

enter image description here

虽然对于 Pixel 5 我没有尝试 setPhysicalCameraId(cameraId) https://developer.android.com/reference/android/hardware/camera2/params/OutputConfiguration.html#setPhysicalCameraId(java.lang.String)

我觉得这个方法可以用来切换不同的物理相机(比如我们可以开广角相机)

更新

是的,我们可以对 Pixel 4、5(我想还有更多设备和制造商)使用 setPhysicalCameraId 方法来设置特定的物理相机

接下来是逻辑:

  1. 您使用相机管理器使用逻辑相机 ID 打开相机

  2. 那么如果逻辑摄像头支持多摄像头功能,那么它应该有非空的物理摄像头 ID 列表

  3. 您可以从物理相机 ID 列表中选择任何 ID 并将其设置为 OutputConfiguration:

val outputs = surfaces.map {
OutputConfiguration(it).apply {
setPhysicalCameraId(cameraIdx)
}
}
cameraDevice.createCaptureSessionByOutputConfigurations(
outputs,
stateCallback,
backgroundCameraHandler
)

更新!警告! 但它预览的是同一个 View ,所以这个方法似乎不起作用(尽管没有异常(exception)),没有任何改变,无论你是否设置物理相机

似乎从 Android 10 开始就坏了 - Android 10 (api 29) camera2 api regression with wide-angle camera

更新

我还尝试使用 SessionConfiguration 对象而不是弃用的方法 createCaptureSessionByOutputConfigurations

创建捕获 session
val config = SessionConfiguration(
SessionConfiguration.SESSION_REGULAR,
outputs,
backgroundCameraExecutor!!,
stateCallback
)
cameraDevice.createCaptureSession(config)

但还是没有任何改变

关于android - Camera2 在 Android API 29 中用两个物理流替换一个逻辑流,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/55923506/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com