2015-05-29 6 views
1

Я работаю над разработкой приложений для Android, использующих камеру. Чтобы отобразить предварительный просмотр камеры, я просмотрел множество примеров с использованием вида поверхности или текстуры. Почему они предпочитают использовать ImageView для отображения предварительного просмотра камеры? Я использовал Imageview для отображения предварительного просмотра, и он отлично работает.Textureview/Surface view for Camera preview - Android

Спасибо.

+1

«Я использовал Imageview для отображения предварительного просмотра, и он отлично работает» - что вы передаете как параметр «setPreviewDisplay()» или «setPreviewTexture()», который работает с «ImageView»? – CommonsWare

+0

Я создаю растровое изображение из кадра предварительного просмотра камеры и устанавливаю его в Imageview с помощью метода ** setImageBitmap() **. Для каждого кадра из камеры я обновляю Imageview с помощью этого метода с помощью обработчика фона. – user3027732

+0

@ user3027732 О, боже мой! –

ответ

4

Пожалуйста, не используйте ImageView для этого. Это крайне неэффективно, и я был бы удивлен, если бы вы смогли создать предварительный просмотр с высоким разрешением (1080p) при таком подходе.

SurfaceView и TextureView как напрямую подталкивают буферы нулевой копии от драйверов камеры к аппаратным композиторам, так и к графическому процессору соответственно. Никаких дополнительных копий или преобразований буфера нет, кроме того, что конечные преобразования должны выполняться в пункте назначения. Это существенно снижает пропускную способность памяти и накладные расходы процессора.

Создание растровых изображений медленное, процессорное голодание и делает несколько копий каждого кадра, теряя память.

1

Почему они предпочитают использовать ImageView для отображения предварительного просмотра камеры?

Эффективность, среди возможных причин.

С обоими SurfaceView и TextureView базовый движок камеры может работать более непосредственно с выходной поверхностью через графический процессор и двигатель OpenGL, минуя время работы Dalvik/ART. В вашем случае вы вынуждаете движок камеры заполнять Java byte[], затем вы декодируете его в Bitmap, а затем обновляете пользовательский интерфейс через ваш ImageView. Это большая часть дополнительной обработки процессора и суеты памяти, чем требуется, если вы используете поверхность.

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