【问题标题】:How to show two identical camera previews with the Android camera?如何使用 Android 相机显示两个相同的相机预览?
【发布时间】:2013-11-25 15:04:38
【问题描述】:

我需要能够在屏幕上显示来自正在运行的相机实例的两个相同的预览,这可能吗?

到目前为止,我能想到的唯一方法是克隆预览表面视图。所以使用提供给onPreviewFrame的原始视频数据, 我正在为当前帧创建一个新位图,然后将其绘制到表面支架画布上。

这在 ui 线程上运行时显示完美,但显然它在创建位图时每隔几秒钟阻塞一次 UI。我现在已将位图创建移至解决应用程序锁定问题的新线程,但现在我的表面视图闪烁/流泪!

这会奏效吗?还是我走错了路?如何停止闪烁?

减少示例代码;

public void onPreviewFrame(byte[] data, Camera camera) {

-- new thread
// create bitmap from YUV (videoFrame)


-- UI thread
  Canvas canvas = null;
    try {
        canvas = surfaceHolder.lockCanvas();
        if (canvas != null) {
        canvas.drawBitmap(videoFrame, null, new Rect(0, 0, 200, 200), null);
        }
    } catch (Exception e) {
        mLogger.error(e.getMessage());
    } finally {
        if (canvas != null) {
        surfaceHolder.unlockCanvasAndPost(canvas);
        }
    }
}

我相信这与surfaceview双缓冲区有关,我有很多解决方案但无法阻止闪烁!

【问题讨论】:

  • 你能帮助你如何做到这一点......我卡住了!

标签: java android android-camera surfaceview


【解决方案1】:

如果您不需要在 3.0 (Honeycomb) 之前的 Android 版本上运行,您可以使用 SurfaceTexture 输出选项和 OpenGL ES 来渲染多个预览。

设置工作的 OpenGL 视图有点复杂,因此您需要找到相关指南。 一旦你有了这个工作,创建一个SurfaceTexture对象,它带有你想要用于预览纹理的OpenGL纹理ID,用setPreviewTexture而不是使用setPreviewDisplay将它传递到相机,然后在你的OpenGL线程中,调用@987654323 @ 更新纹理以显示来自相机的最新帧(最好响应onFrameAvailable 回调以获得最佳性能)。

然后,您需要 OpenGL 代码为您的两个预览副本渲染两个矩形,并需要一个着色器来在两者上绘制预览纹理。

这是一个不错的设置,但最终,您将拥有一个非常灵活的系统 - 然后您可以以各种有趣的方式为预览设置动画,等等。

【讨论】:

  • 我目前正在使用 onPreviewFrame 发送一些数据以将数据发送到一些第三方本机代码。是否可以使用您建议的方法并仍然在 onPreviewFrame 中接收数据?
猜你喜欢
  • 2017-01-25
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多