2015-05-29 72 views
1

我正在开发使用相机的Android应用程序。为了显示相机预览,我观察了很多使用表面视图或纹理视图的例子。 为什么这些优先于使用ImageView来显示相机预览?我已经使用Imageview来显示预览,它工作正常。相机预览的纹理视图/表面视图 - Android

谢谢。

+1

“我用Imageview来显示预览效果并且工作正常” - 你将参数传递给了'setPreviewDisplay()'或'setPreviewTexture()',它与'ImageView'一起使用了什么? – CommonsWare

+0

我使用** setImageBitmap()**方法从相机预览框架创建位图并将其设置为Imageview。对于来自相机的每一帧,我都使用背景处理程序使用此方法更新Imageview。 – user3027732

+0

@ user3027732天啊! –

回答

4

请不要为此使用ImageView。这是非常低效的,如果能够用这种方法生成高分辨率预览(1080p),我会感到惊讶。

SurfaceView和TextureView分别将相机驱动程序的零拷贝缓冲区直接推送到硬件编辑器或GPU。没有额外的缓冲区副本或转换,除非最终转换需要在目的地完成。这大大减少了内存带宽和CPU开销。

创建位图的速度很慢,而且很耗CPU,并且每个帧都会有多个副本,同样会浪费内存。

1

为什么这些优先于使用ImageView来显示相机预览?

效率,也许其他原因之一。

对于SurfaceViewTextureView,底层摄像机引擎可以通过GPU和OpenGL引擎更直接地与输出表面一起工作,绕过Dalvik/ART运行时。在你的情况下,你迫使相机引擎填写一个Java byte[],然后你将它解码为Bitmap,然后通过你的ImageView更新UI。如果您使用曲面,那么会出现大量额外的CPU处理和内存烦恼。