Я испытываю низкую скорость FPS с новым API camera2. В частности, несмотря на выбор самого высокого диапазона FPS (30,30) из
characteristics.get(CameraCharacteristics.CONTROL_AE_AVAILABLE_TARGET_FPS_RANGES);
и установить его с помощью
mPreviewRequestBuilder.set(CaptureRequest.CONTROL_AE_TARGET_FPS_RANGE, bestFPSRange);
Я получаю гораздо более низкие средние показатели для изображений с высоким разрешением на обоих устройствах, которые я тестировал (Samsung S5 и Xperia Z3 Compact). Вот как я настроил OnImageAvailableListener
:
int format = ImageFormat.YUV_420_888;
Size largest = map.getOutputSizes(format)[0];
Log.d("Images", "sizes: " + Arrays.toString(map.getOutputSizes(format)));
mImageReader = ImageReader.newInstance(largest.getWidth(), largest.getHeight(), format,
/* maxImages */50);
mImageReader.setOnImageAvailableListener(new OnImageAvailableListener() {
private int frames = 0;
private long initialTime = SystemClock.elapsedRealtimeNanos();
@Override
public void onImageAvailable(ImageReader reader) {
reader.acquireLatestImage().close();
frames++;
if ((frames % 30) == 0) {
long currentTime = SystemClock.elapsedRealtimeNanos();
long fps = Math.round(frames * 1e9 / (currentTime - initialTime));
Log.d("Image", "frame# : " + frames + ", approximately " + fps + " fps");
frames = 0;
initialTime = SystemClock.elapsedRealtimeNanos();
}
}
}, mBackgroundHandler);
По сути, приведенный выше оператор if берет средний FPS каждые 30 выборок. На практике при самых высоких разрешениях на обоих устройствах (1920x1080) я вижу диапазон кадров в 15-20 кадров в секунду. Другие в сети, похоже, указывают, однако, что 30 кадров в секунду должны быть возможны независимо от разрешения, и на самом деле, используя старый устаревший API камеры, я МОГУ получить 30 кадров в секунду на обоих устройствах с самым высоким разрешением. Итак, что мне не хватает?
Я уже пробовал все комбинации ШАБЛОНА (например, TEMPLATE_PREVIEW) и формата (например, ImageFormat.YUV_420_888). Какую еще ручку я забыл повернуть?