2011-12-16 20 views
0

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

回答

0

虽然我还没有收到正式答复,并且可能不会在新版Android版本中使用,但我已经发现SURFACE_TYPE_NORMAL无法用于许多设备上的相机预览。

这个答案来自各种设备上的测试。在某些设备上不会收到视频;它与所使用的各种参数无关。

相关问题