当 Camera2 API 甚至不返回所有相机时,某些应用如何访问超广角镜头相机?



所以我有不同的三星设备(高达S22 Ultra),很容易访问超广角镜头相机,因为CameraManager.cameraIdList返回4个相机,包括一般后镜头相机和超广角镜头相机。

但许多其他设备(小米,Vivo和许多其他设备)只有两个通用摄像头-后置和前置。

我的一些应用程序的用户说,他们能够使用超广角镜头相机的应用程序,如mcpro24fpsgcam。一名用户使用小米POCO X3 (Android 11)

这些应用程序是如何访问所有摄像头的?

另外Camera2 API通常返回不支持视频稳定(制造商不会在此API中暴露它)

val characteristics = getCameraCharacteristics(context, cameraIdx)
val modes =
characteristics.get(CameraCharacteristics.CONTROL_AVAILABLE_VIDEO_STABILIZATION_MODES)
?: intArrayOf()
val supported = CameraMetadata.CONTROL_VIDEO_STABILIZATION_MODE_ON in modes

supported通常是false,但即使在某些设备上返回true,它似乎仍然没有真正做任何视频稳定,帧上没有任何裁剪,基本上没有效果,基于我的应用程序的用户响应

所以如果camera2 API返回支持视频稳定,下面的代码不会改变任何东西:

if (isVideoStabilizationSupported()) {
captureRequestBuilder.set(
CaptureRequest.CONTROL_VIDEO_STABILIZATION_MODE,
CameraMetadata.CONTROL_VIDEO_STABILIZATION_MODE_ON
)

但是mcpro24fpsgcam也支持这个,但它似乎是一个自定义的解决方案,但我真的不明白你怎么能实现一些自定义的东西与camera2 API而不影响性能,因为它必须实现在低水平

Mb这样的应用程序可以通过使用新的变焦比相机参数访问超广角镜头相机:

captureRequestBuilder.set(CaptureRequest.CONTROL_ZOOM_RATIO, 0.6f)

它适用于我的三星设备,0.6...10变焦比。所以可以在镜头之间切换而不改变相机id

Android摄像头api的长期目标是多摄像头集群(如超宽/宽/远摄像头的组合)可以被应用程序使用,而无需专门编写代码。

这是通过逻辑多摄像头api完成的。当实现时,这意味着将有一个逻辑摄像头,由两个或多个物理摄像头组成。您在相机ID列表中看到的是逻辑相机,您还可以从cameracharcharacteristics #getPhysicalCameraIds()中获得物理相机列表。通过这种安排,您可以看到扩展的变焦范围,例如您提到的(0.6 ... 10),并且当您缩小或放大时,相机实现将自动切换到超广角或长焦相机。这取决于各种其他条件;例如,大多数长焦镜头不能很近地对焦,所以如果你在聚焦附近物体的同时放大,相机可能会保持默认的广角相机;同样,远摄相机在弱光条件下往往表现较差,因此数码变焦可能比光学变焦效果更好,而且放大倍率更高。

如果你有一个特殊的原因使用底层uw/wide/tele相机,你可以通过setPhysicalCameraId()将它们包含在流配置中,并直接使用它们;如果你想在你的UI中提供一个"使用远摄"按钮,你可以强制哪个相机从流,而不是让逻辑相机尝试使用它的最佳判断来选择活动相机。

不幸的是,并不是所有的设备都迁移到逻辑相机API;这些设备可能会像你看到的那样,将多摄像头集群列为单独的摄像头id,或者可能只是将一些摄像头完全隐藏在应用程序之外。这样做的主要问题是,它要求应用程序做额外的工作,以获得最佳质量的缩放/放大,并且各种实现使得在应用程序中编写代码以使其适用于所有设备变得困难。

最新更新