Запись 4K с помощью MediaRecorder

Просматривал видео с камеры2 образец приложения, опубликованное Google, и один из методов выглядит следующим образом:

/**
 * In this sample, we choose a video size with 3x4 aspect ratio. Also, we don't use sizes
 * larger than 1080p, since MediaRecorder cannot handle such a high-resolution video.
 *
 * @param choices The list of available sizes
 * @return The video size
 */
private static Size chooseVideoSize(Size[] choices) {
    for (Size size : choices) {
        if (size.getWidth() == size.getHeight() * 4 / 3 && size.getWidth() <= 1080) {
            return size;
        }
    }
    Log.e(TAG, "Couldn't find any suitable video size");
    return choices[choices.length - 1];
}

Я возился со своей собственной реализацией camera2 и попытался записать видео 4K с помощью медиа-рекордера, который работал нормально - записанный файл сообщил о размерах 3840 × 2160.

Итак, является ли комментарий в образце неверным или MediaRecorder не может обрабатывать большие разрешения на Lollipop, но поддерживает Marshmallow или что-то еще?


person vkislicins    schedule 11.11.2015    source источник
comment
Возможности записи мультимедиа будут зависеть от устройства, а также от ОС.   -  person CommonsWare    schedule 11.11.2015
comment
так вы предполагаете, что автор перестраховывается, говоря, что все устройства будут обрабатывать ‹= 1080p, но большее разрешение небезопасно? Хотя массив choices в этом методе взят из CameraCharacteristics / StreamConfigurationMap getOutputSize - который, как я думал, был собран из профиля оборудования камеры? Непонятно ..   -  person vkislicins    schedule 11.11.2015
comment
Я говорю, что камера в Android вообще сбивает с толку. :-)   -  person CommonsWare    schedule 11.11.2015


Ответы (2)


CamcorderProfile поддерживает 4K, как «QUALITY_2160P», поэтому лучше всего проверить, поддерживается ли этот профиль. Если это так, то ожидается, что использование этого размера для вывода камеры2 в MediaRecorder будет работать.

Однако, поскольку не все устройства поддерживают 4K, 1080p является консервативным ограничением, используемым в примере приложения - некоторые части приложения также предшествуют добавлению поддержки 4K в CamcorderProfile, поэтому комментарий немного устарел.

person Eddy Talvala    schedule 13.11.2015

массив choices в этом методе взят из CameraCharacteristics / StreamConfigurationMap getOutputSize - который, как я думал, был собран из профиля оборудования камеры?

Верно, но этот профиль камеры не обязательно соответствует возможностям MediaRecorder, например это.

Вы можете больше доверять профилям видеокамеры,

mediarecorder.setProfile(CamcorderProfile.get(CamcorderProfile.QUALITY_HIGH));

но не без сбоев, и нет гарантии, что на конкретном устройстве MediaRecorder не может обрабатывать больше этого.

В любом случае, CamcorderProfile имеет "официальный" профили до 1080p, поэтому это разумный выбор для примера кода, который не претендует на получение наилучших результатов для самого широкого диапазона устройств.

person Alex Cohn    schedule 11.11.2015
comment
Верно, но этот профиль камеры не обязательно соответствует MediaRecorder - вы уверены, что это все еще актуально для камеры2? Это все правда, и я прошел через свою долю боли, связанной с этим, с реализацией камеры до леденца на палочке. Я надеялся, что они исправили / упростили для camera2, а StreamConfigurationMap - это класс camera2 - person vkislicins; 11.11.2015
comment
Камера по-прежнему отделена от MediaRecorder, даже если это camera2. Я считаю, что Camcorder более тесно связан с MediaRecorder, но даже это не гарантируется. Собственно, мой личный опыт показывает, что часто реализации camera2 все еще менее надежны, чем старый API. - person Alex Cohn; 11.11.2015
comment
CamcorderProfile.QUALITY_HIGH не работает на Sony L1 - person vuhung3990; 24.10.2017
comment
@ vuhung3990 очень плохо. Возвращает ли это устройство true для CamcorderProfile.hasProfile (0, CamcorderProfile.QUALITY_HIGH)? - person Alex Cohn; 24.10.2017