如何知道Android设备在API级别上支持的最大帧率?

4
在谷歌搜索时,我找到了this information,如果我想让我的安卓设备启用相机录制高帧率视频,我需要通过设备供应商放置特定的参数来调用相机API。
例如,通过调用以下方法,我可以使我的Galaxy S6相机应用程序持续记录120帧每秒。
camera = Camera.open();
Camera.Parameters parms = camera.getParameters();

// for 120fps
parms.set("fast-fps-mode", 2); // 2 for 120fps
parms.setPreviewFpsRange(120000, 120000);

但问题是,并不是所有的设备(包括LG和其他厂商)都支持120fps(或更高)。因此,当运行我的相机应用程序进行错误处理时,我需要知道API级别中的最大实时fps。
在我的情况下,Camera.Parameters.getSupportedPreviewFpsRange()对我不起作用。 它仅返回最大值30000(表示30fps),即使它可以记录120000(120fps)。 我认为这是因为以高帧率(超过30fps)录制与相机硬件属性密切相关,这就是我需要调用特定于供应商的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(棒棒糖)以上版本中,如果设备具有 REQUEST_AVAILABLE_CAPABILITIES_CONSTRAINED_HIGH_SPEED_VIDEO 能力,Camera2 API 提供了一种方法可以获取支持的 fps 范围,如下所示:Range<Integer>[] ranges = map.getHighSpeedVideoFpsRanges(); - Sunggook Kim
我无法获取前置摄像头的帧率,例如:String cameraId = manager.getCameraIdList()[1]; - ashishdhiman2007
1
@ashishdhiman2007 如果你无法从前置摄像头获取fps,那么有两种可能性是这些代码对你不起作用。1. 你的前置摄像头不是FULL_LEVEL。从Lollipop开始,Camera2 API将相机分为三个级别(FULL、LEGACY、LIMITED)。2. 你的前置摄像头是FULL_LEVEL,但不支持高速fps录制。上面的代码在相机(前置或后置)支持高速fps录制时才能正常工作。 - Sunggook Kim
1
如果您的设备不支持高速fps录制或者没有达到FULL级别,您可以通过以下方式获取fps范围。Range<Integer>[] fpsRange = characteristics.get(CameraCharacteristics.CONTROL_AE_AVAILABLE_TARGET_FPS_RANGES); - Sunggook Kim
2
@SunggookKim 我在你编辑的代码中看到的问题是,设备支持特定分辨率下的特定帧率。例如(720p @ 120 fps)。您如何检查给定尺寸的fps是否受支持? - HB.
@HB 你好,朋友!你找到了检查给定分辨率支持的帧率的解决方案了吗? - yash khatri
1个回答

0

您可以通过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;
    //...
    }
}

这将为您提供支持高速捕获的最低可用配置文件。我怀疑在那里有许多早期的Lollipop设备具有这样的硬件可能性(如果有的话),因此这应该可以满足您的需求。


谢谢 @sichevoid。但这对我不起作用,即使我在支持120fps录制的Galaxy S6上尝试了。您在哪个设备上尝试过这段代码? - Sunggook Kim
@SunggookKim 它在Nexus 6P上运行良好。不幸的是,我没有Galaxy S6可以尝试。我建议您在S6上尝试其他CamcorderProfile.QUALITY_HIGH_SPEED_*配置文件变体。 - sichevoid
我已经尝试了所有以“QUALITY_HIGH_SPEED_”开头的其他CamcorderProfile,但并非所有都能正常工作。我认为这与设备的规格有关。此外,我认为,如果我们无论如何在API 21以上尝试这个,我们可以使用我在原始帖子中添加的StreamConfigurationMap。 - Sunggook Kim
同意,看起来这是一个有效的方法。 - sichevoid

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接