安卓:如何通过回调显示相机预览?
我需要做的很简单,我想使用相机回调从相机手动显示预览,我想在真实设备上获得至少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中无法快速完成。所以我不能使用这个解决方案。在另一个问题中对此的一些细节。
3. 在 (GL)SurfaceView 上使用 NDK 处理 YUV 数据,在 (GL)SurfaceView 上显示摄像机预览。我在这里找到了一个使用一些C函数和NDK的解决方案。但是我没有设法使用它,这里有一些更多细节。但无论如何,这个解决方案是为了返回ByteBuffer以在OpenGL中将其显示为纹理,并且它不会比之前的尝试更快。因此,我必须修改它以返回int[]数组,该数组可以使用canvas.drawBitmap()绘制,但我对C的理解还不够多, 无法做到这一点。
那么,我错过了其他方式或对我尝试过的尝试有一些改进吗?