【问题标题】:How to know maximum supported fps by android device on API level?如何知道 android 设备在 API 级别上支持的最大 fps?
【发布时间】: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&lt;Integer&gt;[] fpsRange = characteristics.get(CameraCharacteristics.CONTROL_AE_AVAILABLE_TARGET_FPS_RANGES);
  • @SunggookKim 您在编辑中发布的代码我看到的问题是设备在特定分辨率下支持特定帧速率。例如(120 fps @ 720p)。如何检查给定尺寸的 fps 是否受支持?

标签: android camera max frame-rate


【解决方案1】:

您可以通过启动 API-21 的CamcoderProfile 获取该信息,如下所示:

for (String cameraId : manager.getCameraIdList()) {
    int id = Integer.valueOf(cameraId);
    if (CamcorderProfile.hasProfile(id, CamcorderProfile.QUALITY_HIGH_SPEED_LOW)) {
    CamcorderProfile profile = CamcorderProfile.get(id, CamcorderProfile.QUALITY_HIGH_SPEED_LOW);
    int videoFrameRate = profile.videoFrameRate;
    //...
    }
}

这将为您提供支持高速捕获的最低可用配置文件。我怀疑有很多棒棒糖之前的设备都有这样的硬件可能性(如果有的话),所以这应该会让你有所了解。

【讨论】:

  • 谢谢@sichevoid。但这对我不起作用,即使我尝试了支持 120fps 录制的 Galaxy S6。您在哪个设备上尝试过此代码?
  • @SunggookKim 它适用于 Nexus 6P。不幸的是,我没有 Galaxy S6 可以尝试。我建议您在 S6 上尝试其他 CamcorderProfile.QUALITY_HIGH_SPEED_* 配置文件变体。
  • 我已经尝试了所有其他以“QUALITY_HIGH_SPEED_”开头的 CamcorderProfile,但都没有工作。我认为这与设备的规格有关。另外,我认为,如果我们通过 API 21 尝试这个,我们可以使用我在原始帖子中添加的 StreamConfigurationMap。
  • 同意,这看起来是一种有效的方法。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2020-04-10
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多