Доступ к камере с высоким fps на Android

Есть телефоны с официальной поддержкой записи с высоким fps, такие как Galaxy S5 и S6. Я пробовал оба, с обоими вы можете записывать видео с высокой частотой кадров (60 или даже 120 кадров в секунду) с помощью приложения камеры по умолчанию. (Или на S6 с помощью функции Gear VR «Passthrough Camera».) НО: когда вы запрашиваете возможности камеры через стандартные API Android (пробовал на S5 на 4.4 и 5.0 и на S6 на 5.1, пробовал как старый, так и новый API Camera2) во всех случаях 30 кадров в секунду считаются самыми высокими из доступных. Означает ли это, что эти телефоны используют частные проприетарные API-интерфейсы для доступа к возможностям с высоким fps, а стандартного способа доступа к более высоким fps нет? Это недостаток производителя (который может измениться в зависимости от будущих версий программного обеспечения или телефонов) или я что-то упустил? Мне даже не нужно медленное движение, просто камера с высокой частотой кадров для использования в реальном времени, поэтому 60 кадров в секунду будет достаточно.

Пример, который я пытался запросить у fps камеры в старом API камеры;

List<Camera.Size> a = camera.getParameters().getSupportedPreviewSizes();
List<int[]> b = camera.getParameters().getSupportedPreviewFpsRange();
int[] c = new int[2];
camera.getParameters().getPreviewFpsRange(c);

То же самое в camera2 API:

CameraManager manager = (CameraManager) getSystemService(Context.CAMERA_SERVICE);
String[] cameras = manager.getCameraIdList();
for(String camera : cameras) {
    CameraCharacteristics cc = manager.getCameraCharacteristics(camera);
    Range<Integer>[] fpsRange = cc.get(cc.CONTROL_AE_AVAILABLE_TARGET_FPS_RANGES);
}

Я получаю только диапазоны: [15, 15], [24, 24], [10, 30], [15, 30], [30, 30] (еще меньше диапазонов со старым API камеры).

В API Camera2 я нашел несколько способов доступа к записи с высокой частотой кадров в секунду:createConstrainedHighSpeedCaptureSession (), Но он определяет высокоскоростную запись видео как «частоту кадров> = 120 кадров в секунду», поэтому мне даже не нужно это для 60 кадров в секунду. Во всяком случае, я запросил эту возможность, но, похоже, она не поддерживается на S6. Код, который я пробовал:

CameraManager manager = (CameraManager) getSystemService(Context.CAMERA_SERVICE);
String[] cameras = manager.getCameraIdList();
for(String camera : cameras) {
    CameraCharacteristics cc = manager.getCameraCharacteristics(camera);
    CameraCharacteristics.Key<int[]> aa = cc.REQUEST_AVAILABLE_CAPABILITIES;
    for (int i = 0; i < cc.get(CameraCharacteristics.REQUEST_AVAILABLE_CAPABILITIES).length; i++) {
            Log.e(TAG, "Capability: " + cc.get(CameraCharacteristics.REQUEST_AVAILABLE_CAPABILITIES)[i]);
    }
}

Он говорит, что поддерживает только 0, 1, 2, 3, 5, 6. REQUEST_AVAILABLE_CAPABILITIES_CONSTRAINED_HIGH_SPEED_VIDEO будет 9.

На данный момент я в значительной степени иссяк, если идеи, подозревающие эти возможности, действительно не доступны через стандартные API на этих телефонах. Любая помощь приветствуется.

Я знаю, что вопрос довольно похож / связан с этим:Захват видео с высоким fps с использованием нового Camera API Но мой вопрос носит более общий характер и не относится ни к старому, ни к новому API камеры, ни к конкретным устройствам. Мне также любопытно, что поддерживается стандартными API-интерфейсами, которые поддерживаются другими новыми флагманскими устройствами, поскольку я мог протестировать его только на 3 устройствах.

Ответы на вопрос(0)

Ваш ответ на вопрос