【发布时间】:2011-12-02 00:15:14
【问题描述】:
我需要做的很简单,我想使用相机回调手动显示来自相机的预览,并且我想在真实设备上获得至少 15fps。我什至不需要颜色,我只需要预览灰度图像。 来自相机的图像是 YUV 格式,您必须以某种方式对其进行处理,这是主要的性能问题。我正在使用 API 8。
在所有情况下,我都使用 camera.setPreviewCallbackWithBuffer(),它比 camera.setPreviewCallback() 快。如果我不显示预览,我似乎无法在这里获得大约 24 fps。所以没有问题。
我已经尝试了这些解决方案:
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);
2。在 GLSurfaceView 上将相机预览显示为纹理。 这里我只显示亮度数据(灰度图像),这很容易,每帧只需要一个 arraycopy()。我可以获得大约 12fps,但我需要对预览应用一些过滤器,而且似乎在 OpenGL ES 1 中无法快速完成。所以我不能使用这个解决方案。 another question 中的一些细节。
3.使用 NDK 在 (GL)SurfaceView 上显示相机预览以处理 YUV 数据。我找到了一个解决方案here,它使用了一些 C 函数和 NDK。但我没有设法使用它,here some more details。但无论如何,这个解决方案是返回 ByteBuffer 以在 OpenGL 中将其显示为纹理,并且不会比之前的尝试快。所以我必须修改它以返回 int[] 数组,可以用 canvas.drawBitmap() 绘制,但我对 C 的理解不足以做到这一点。
那么,我是否还有其他方法遗漏或改进了我尝试的尝试?
【问题讨论】:
标签: java android camera android-camera preview