SURFACE_TYPE_NORMAL是否是有效的Android相机类型?

时间:2011-12-16 17:04:34

标签: android surfaceview android-camera surfaceholder

我正在构建一个增强现实应用程序,它从相机中获取帧,使用一些图像处理技术对其进行过滤,并将其显示给用户以代替相机预览。

当我刚开始时,我只是打电话:

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);
    }
}

这非常有效,并且在摩托罗拉Photon上表现不错。

我还拥有摩托罗拉Droid以及LG Optimus;在这两个设备上 onPreviewFrame 永远不会被调用,因此持有者永远不会被回调。并且用户会被黑屏困住。

搜索后我发现需要添加以下行

holder.setType(SurfaceHolder.SURFACE_TYPE_PUSH_BUFFERS);

有了这条线,我终于得到了回调。但问题是如果我尝试调用holder.lockCanvas()我收到错误,因为SURFACE_TYPE_PUSH_BUFFERS不允许这样做。

现在,我已经能够通过在ImageView上放置SurfaceView并将框架绘制到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。

0 个答案:

没有答案