2017-02-08 17 views
1

У меня есть приложение с функцией камеры. Я использую Android Camera2 API. Я обнаружил, что некоторые Android устройства (например, Nexus 6p, Nexus 5) работают лучше, если ImageReader сконфигурирован для обеспечения JPEGs:Как выбрать тип буфера ImageReader для моего приложения для камеры Android?

imageReader = ImageReader.NewInstance(width, height, ImageFormatType.Jpeg, 2); 

и некоторые Android устройств (например, Nexus 7 2013) работают лучше, если ImageReader является сконфигурирован для обеспечения, скажем, RGBA_8888:

imageReader = ImageReader.NewInstance(width, height, (ImageFormatType)1 /* PixelFormat.RGBA_8888 */, 2); 

устройство, которое работает лучше с JPEGs выплевывает эту ошибку, если я использую RGBA_8888:

[ImageReader_JNI] Producer output buffer format: 0x22, ImageReader configured format: 0x1 

Устройство, которое работает лучше с RGBA буферов выплевывает это предупреждение, если я использую JPEGs: (Он по-прежнему работает, но это достаточно медленно, что захваченное изображение темное.)

[ImageReader_JNI] ImageReader_lockedImageSetup: Receiving JPEG in HAL_PIXEL_FORMAT_RGBA_8888 buffer. 

Я должен сделать некоторую обработку я вернусь, так что в конечном итоге было бы лучше, если бы я мог настроить камеру, чтобы просто выплескивать какой-то растровый рисунок, а не JPEG, так как мне нужно преобразовать JPEG в Bitmap, прежде чем продолжить.

Как выбрать тип буфера для перехода к ImageReader?

+0

Каков ваш прецедент? Одиночные снимки (не много захватов в секунду) или непрерывный захват (~ 30 кадров в секунду)? –

+0

У меня есть поверхность предварительного просмотра, которая захватывает непрерывный захват до тех пор, пока вы не нажмете кнопку «Снимок», и в этот момент она захватывает изображение «ImageReader». –

ответ

1

Единственными гарантированными форматами, которые должны поддерживаться всеми устройствами камеры, являются YUV_420_888 и JPEG; даже при этом устройства уровня LEGACY обычно поддерживают только JPEG с максимальным разрешением (и YUV_420_888 при разрешении предварительного просмотра, обычно не выше 1080p).

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

JPEG-захват имеет тенденцию быть более медленным, поскольку устройства уровня LEGACY предполагают, что, когда вы хотите JPEG, вы хотите получить максимальное качество записи, которое требует больше пост-обработки, чем просто кадр предварительного просмотра; плюс, устройства LEGACY могут выполнять измерение вспышки и стрельбу. LIMITED или более совершенные устройства позволяют вам контролировать качество пост-обработки, поэтому оно не привязано к выходному формату и, как правило, поддерживает более высокие разрешения захвата YUV.

Я бы вообще держался подальше от RGBA, если вам нужна широкая поддержка - он работает с устройствами LEGACY - это немного причуда, а LIMITED и лучшие устройства вряд ли его поддержат.

Когда вы говорите, что JPEG работает, но достаточно медленно, чтобы захваченное изображение темное, я немного смущен - почему медленность означает темное изображение? Или вы просто подразумеваете, что изображения выходят из темноты?

+0

На большинстве моих устройств съемка в формате JPEG в порядке. Но на этом Nexus 7 2013, если я захвачу YUV, цвет прекрасен, но если я захвачу в JPEG, иногда бывает темно. Сначала я думал, что это был случай остановки повторения кадров предварительного просмотра или чего-то еще, но это, похоже, не так. –

 Смежные вопросы

  • Нет связанных вопросов^_^