Низкий FPS с Camera2 API

Я испытываю низкую скорость 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). Какую еще ручку я забыл повернуть?


person bremen_matt    schedule 30.01.2017    source источник
comment
Просто чтобы проверить основные вещи, вы просто используете setRepeatingRequest() для запроса?   -  person Eddy Talvala    schedule 31.01.2017
comment
Да. Вы когда-нибудь пробовали рассчитать время таким образом? Если вы просто посмотрите на дисплей на экране, вы никогда не узнаете, что не получаете полные 30 кадров в секунду, поэтому мне интересно, сколько людей на самом деле получают полные 30 кадров в секунду, а сколько просто не засекли это.   -  person bremen_matt    schedule 31.01.2017
comment
Хммм... Я нашел еще несколько устройств: Huawei Mate S, HTC One M9 и LG G4. Получается, что S5, Z3, Mate S и M9 считаются LEGACY устройствами. Между тем, G4 является ПОЛНЫМ устройством. С ПОЛНЫМ устройством у меня нет проблем с fps, и на самом деле кажется возможным делать абсолютно огромные кадры при 30fps с G4. Однако на других устройствах я получаю только около 15 кадров в секунду при 1080p.   -  person bremen_matt    schedule 31.01.2017
comment
Ожидается ли такое поведение с устройствами LEGACY? Что для меня очень странно, так это то, что, используя устаревший API камеры, я могу легко получить 30 кадров в секунду на этих устройствах.   -  person bremen_matt    schedule 31.01.2017
comment
Частота кадров не должна быть такой низкой — режим LEGACY добавляет некоторые накладные расходы, поскольку фактически он должен запускать camera2 поверх устаревшего API камеры, но это не должно быть таким значительным.   -  person Eddy Talvala    schedule 01.02.2017
comment
Я надеялся, что это будет работать с устаревшими устройствами, но тот факт, что все устаревшие устройства дают примерно одинаковую частоту кадров, в то время как полное устройство дает 30 кадров в секунду, кажется мне, что проблема здесь заключается в накладных расходах. Я постараюсь написать сообщение в блоге и разместить тестовое приложение в магазине игр, чтобы другие могли попробовать позже.   -  person bremen_matt    schedule 01.02.2017
comment
Привет, у меня тоже такая же проблема, я недавно переключился с Camera1 API на Camera2, и FPS сильно упал, есть ли способ решить эту проблему?   -  person wdanxna    schedule 11.06.2018
comment
Нет решения, кроме как использовать старый API, если у вас старый телефон.   -  person bremen_matt    schedule 11.06.2018


Ответы (1)


S5 и Z3 Compact классифицируются как УСТАРЕВШИЕ устройства. Я тестировал этот код на других устройствах LEGACY, включая

Самсунг Галакси С5

Xperia Z3 Компактный

HTC One M9

Хуавей Мате С

Все они возвращали низкую частоту кадров (примерно 15 кадров в секунду) при разрешении 1080p. Один из найденных мною телефонов, LG G4, поддерживает ПОЛНЫЙ профиль. На этом устройстве я смог получить 30 кадров в секунду даже при большом размере кадра. Поэтому я сильно подозреваю, что в оболочке camera2 API есть накладные расходы, которые вызывают эту проблему.

person bremen_matt    schedule 24.09.2019
comment
Привет, @bremen_matt, у меня похожие проблемы с некоторыми устройствами наших клиентов. Знаете ли вы, есть ли список всех этих так называемых LEGACY моделей? Кстати, даже если устройство использует Android 9+, будет ли оно работать как LEGACY? - person Natan Lotério; 11.11.2020
comment
Я никогда не видел списка, но я считаю, что в 2020 году почти все телефоны будут ПОЛНОЦЕННЫМИ устройствами. - person bremen_matt; 11.11.2020
comment
В качестве быстрой проверки, чтобы узнать, какой уровень поддерживает ваше устройство, вы можете попробовать установить приложение из магазина игр. Кажется, есть много приложений, которые быстро отображают эту информацию, например это (play.google.com/store/apps/). - person bremen_matt; 11.11.2020