【发布时间】:2016-08-22 15:06:54
【问题描述】:
在谷歌搜索时,我得到this information,如果我想让我的相机在安卓设备上录制高帧率视频,我需要设置设备供应商的特定参数以调用相机 API。
例如,通过调用以下方法,我可以让我的 Galaxy S6 相机应用程序持续录制 120 fps。
camera = Camera.open();
Camera.Parameters parms = camera.getParameters();
// for 120fps
parms.set("fast-fps-mode", 2); // 2 for 120fps
parms.setPreviewFpsRange(120000, 120000);
但问题是并非所有设备(包括 LG 和其他供应商)都支持 120 fps(或更高)。因此,在运行我的相机应用程序进行错误处理时,我需要实时了解 API 级别的最大 fps。
就我而言,Camera.Parameters.getSupportedPreviewFpsRange() 不适合我。 它只返回最大 30000(意味着 30fps),即使它可以以 120000(120 fps)录制。我认为这是因为以高帧率(超过 30 fps)录制与相机硬件属性密切相关,这就是我需要调用供应商特定 API 的原因。
有没有一种通用的方法可以在 API 级别通过相机设备获得最大 fps?
---------------------- 编辑 ----------------------
在 API21(LOLLIPOP) 上,我们可以使用 StreamConfigurationMap 来获得高速 fps 录制的最大值。用法如下。
CameraManager manager = (CameraManager)activity.getSystemService(Context.CAMERA_SERVICE);
String cameraId = manager.getCameraIdList()[0];
CameraCharacteristics characteristics = manager.getCameraCharacteristics(cameraId);
StreamConfigurationMap map = characteristics.get(CameraCharacteristics.SCALER_STREAM_CONFIGURATION_MAP);
Range<Integer>[] fpsRange = map.getHighSpeedVideoFpsRanges(); // this range intends available fps range of device's camera.
【问题讨论】:
-
API21(Lollipop) 以上,Camera2 API 提供了一种方法,如果设备具有 REQUEST_AVAILABLE_CAPABILITIES_CONSTRAINED_HIGH_SPEED_VIDEO 能力,则该方法能够获得以下支持的 fps 范围。 Range
[] 范围 = map.getHighSpeedVideoFpsRanges(); -
我无法获得前置摄像头的 fps,例如。 String cameraId = manager.getCameraIdList()[1];
-
@ashishdhiman2007 如果您无法从前置摄像头获取 fps,则上述代码有两种可能不适合您。 1. 你的前置摄像头不是 FULL_LEVEL。在 Lollipop 中,Camera2 api 将相机分为三个级别(FULL、LEGACY、LIMITED)。 2. 你的前置摄像头是 FULL_LEVEL 但不支持高速 fps 录制。上面的代码在相机(正面或背面)支持高速 fps 录制时正常工作。
-
如果您的设备不是 FULL 级别或不支持高速 fps 录制,您可以通过这种方式获取 fps 范围。
Range<Integer>[] fpsRange = characteristics.get(CameraCharacteristics.CONTROL_AE_AVAILABLE_TARGET_FPS_RANGES); -
@SunggookKim 您在编辑中发布的代码我看到的问题是设备在特定分辨率下支持特定帧速率。例如(120 fps @ 720p)。如何检查给定尺寸的 fps 是否受支持?
标签: android camera max frame-rate