【问题标题】:Is SURFACE_TYPE_NORMAL a valid Android camera type?SURFACE_TYPE_NORMAL 是有效的 Android 相机类型吗?
【发布时间】:2011-12-16 17:04:33
【问题描述】:

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

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

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 不允许这样做。

现在我已经能够通过在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。

【问题讨论】:

    标签: android surfaceview android-camera surfaceholder


    【解决方案1】:

    虽然我没有收到官方答复,而且可能不会,因为在较新的 Android 版本上已弃用,但我发现 SURFACE_TYPE_NORMAL 不适用于许多设备上的相机预览。

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

    【讨论】:

      猜你喜欢
      • 2012-11-05
      • 2020-07-29
      • 2022-10-14
      • 1970-01-01
      • 1970-01-01
      • 2013-09-24
      • 1970-01-01
      • 2013-02-13
      • 2021-09-05
      相关资源
      最近更新 更多