我正在构建一个增强现实应用程序,它可以从相机获取帧,使用一些图像处理技术对其进行过滤,并将它们显示给用户以代替相机预览。SURFACE_TYPE_NORMAL是否为有效的Android相机类型?
当我刚开始我只是呼吁:
holder = getHolder();
holder.addCallback(this);
...
camera.addCallbackBuffer(buffer);
camera.setPreviewDisplay(holder);
camera.setPreviewCallbackWithBuffer(callback);
camera.startPreview();
我做了以下的回调中:
SurfaceHolder holder;
Canvas c = holder.lockCanvas();
if (c != null) {
try {
// Draw to canvas
} finally {
holder.unlockCanvasAndPost(c);
}
}
这个工作还算不错,并给在摩托罗拉光子不俗的表现。
我还拥有摩托罗拉Droid以及LG Optimus;在这两个设备上onPreviewFrame将永远不会被调用,因此持有者永远不会在回调中绘制。用户会被黑屏困住。
周围搜索后,我发现,需要下面的行添加
holder.setType(SurfaceHolder.SURFACE_TYPE_PUSH_BUFFERS);
这一行,我终于得到了回调。但问题是如果我尝试拨打holder.lockCanvas()
我收到错误,因为这是SURFACE_TYPE_PUSH_BUFFERS
不允许的。
现在我已经能够通过在SurfaceView
的顶部放置一个ImageView
并将帧画到ImageView
来解决此问题。但是与使用SURFACE_TYPE_NORMAL
相比,这样的表现可怕。
我的问题是:
- 是
SURFACE_TYPE_NORMAL
有效的使用型,或可我只相信SURFACE_TYPE_PUSH_BUFFERS
? - 如果是这样,是否有可能确定设备是否支持
SURFACE_TYPE_NORMAL
,这样我就可以挤出那些额外的性能?是否有某些Android版本或支持它的制造商?
作为一个便笺,我明白对于Honeycomb(3.0),这些值不再受支持。但他们要求2.3和更低。同样对于ICS(4.0),新的SurfaceTexture
管道正在快速发展。但我仍然想支持至少2.2和2.3。