首先 - 我已经研究了一段时间,并尝试了几种解决方案,所以不要给我发现你在谷歌上找到的第一个链接。Android:如何使用回调显示相机预览?
我需要做的事很简单,我想用相机回调手动显示相机预览,并且我想在真实设备上至少获得15fps。我甚至不需要颜色,我只需要预览灰度图像。 来自相机的图像是YUV格式,您必须以某种方式处理它,这是主要的性能问题。我正在使用API 8.
在所有情况下,我使用camera.setPreviewCallbackWithBuffer(),它比camera.setPreviewCallback()更快。如果我不显示预览,看起来我无法在这里获得大约24帧/秒的速度。所以没有问题。
我曾尝试以下解决方案:
1.显示相机预览上SurfaceView为位图。它的工作原理,但性能约为6fps。
baos = new ByteOutputStream();
yuvimage=new YuvImage(cameraFrame, ImageFormat.NV21, prevX, prevY, null);
yuvimage.compressToJpeg(new Rect(0, 0, prevX, prevY), 80, baos);
jdata = baos.toByteArray();
bmp = BitmapFactory.decodeByteArray(jdata, 0, jdata.length); // Convert to Bitmap, this is the main issue, it takes a lot of time
canvas.drawBitmap(bmp , 0, 0, paint);
上的GLSurfaceView
2.显示相机预览作为纹理。在这里,我只显示亮度数据(灰度图像),这是很容易的,它只需要在每个帧上的一个arraycopy()。我可以获得大约12fps,但我需要应用一些过滤器预览,看来,它不能在OpenGL ES 1中快速完成。所以我不能使用此解决方案。这个的一些细节在another question。
3.使用NDK处理YUV数据一个(GL)SurfaceView显示相机预览。我找到一个解决方案here,它使用了一些C函数和NDK。但我没有设法使用它,here some more details。但无论如何,这个解决方案是为了返回ByteBuffer在OpenGL中将其显示为纹理,并且不会比以前的尝试更快。所以我将不得不修改它返回int []数组,可以用canvas.drawBitmap()绘制,但我不明白C足以做到这一点。
那么,有没有其他的方式,我失踪或尝试一些改进?
感谢您的回复!
谢谢,但我真的需要手动使用回调和显示图像。我不需要灰度图像,我使用了一些更多的滤镜,我没有在我的问题中提到... –