Этот вопрос предназначен для высокоскоростных видеосессий, а не для обычных видеосессий.
В настоящее время в Android Camera2 API для определения оптимального размера предварительного просмотра я использую целевой выходной размер видео в качестве эталона и вычисляю из него наилучший размер предварительного просмотра, используя список вариантов размера, возвращаемых:
// SurfaceTexture.class to get the preview sizes supported by the surface
StreamConfigurationMap.getOutputSizes(SurfaceTexture.class);
Размер вывода видео выбирается из списка, возвращаемого: StreamConfigurationMap.getHighSpeedVideoSizes();
Вычисление размера предварительного просмотра выполняется путем выбора размера из списка SurfaceTexture.class с тем же соотношением сторон, что и для размера выходного видеосигнала, и в пределах ограничения размера 1920x0180, которое является максимальным размером предварительного просмотра, который гарантируется API-интерфейсом camera2.
Сказав все это, при использовании createHighSpeedRequestList этот метод завершится ошибкой, если обнаружит, что любая из поверхностей, переданных в сеанс, не имеет размера из поддерживаемых скоростных размеров, и это относится также к поверхности предварительного просмотра. См. Источник в: android.hardware.camera2.utils.SurfaceUtils.checkConstrainedHighSpeedSurfaces
Вопрос заключается в том, каков оптимальный способ получения действительного размера предварительного просмотра для высокоскоростных видеосеансов? Я не могу полагаться на список вариантов, возвращаемых SurfaceTexture.class, поскольку они не связаны с высокоскоростным сеансом.
Мое лучшее предположение заключается в том, что я должен перебрать все из них и просто найти тот, который находится в списке высокоскоростных размеров, возвращаемых StreamConfigurationMap.getHighSpeedVideoSizes, но я хочу знать, есть ли более надежный надежный способ или хороший пример на что я мог посмотреть.
В вашем случае нет необходимости вызывать StreamConfigurationMap.getOutputSizes(SurfaceTexture.class). Любой размер в списке, который вы получаете из StreamConfigurationMap.getHighSpeedVideoSizes(), будет удовлетворять прежнему условию. Обратите внимание, что если вы выберете какой-то конкретный FPS, некоторые размеры в последнем списке могут не поддерживаться. Обычно мы предпочитаем самый большой из доступных размеров, но если ваши требования позволяют что-то меньшее, сделайте это: это может значительно снизить потребление батареи и улучшить отзывчивость устройства.