如何以最有效的方式创建多个camera2预览?

卡贝斯沃赫拉

我正在尝试根据自己的活动创建4个摄像机预览流。我创建了一个TextureView,将其注册到feed的camera2 API,然后在SurfaceView上设置了一个侦听器,以侦听feed的更改并相应地更新其他3个预览(ImageViews)。您可以在下面的代码中看到:

    private final TextureView.SurfaceTextureListener mSurfaceTextureListener
            = new TextureView.SurfaceTextureListener() {

        @Override
        public void onSurfaceTextureAvailable(SurfaceTexture texture, int width, int height) {
            cameraHandler.openCamera(width, height);
        }

        @Override
        public void onSurfaceTextureSizeChanged(SurfaceTexture surface, int width, int height) {
        }

        @Override
        public boolean onSurfaceTextureDestroyed(SurfaceTexture texture) {
            return true;
        }

        @Override
        public void onSurfaceTextureUpdated(SurfaceTexture texture) {
            for (ImageView mSecondaryPreview : mSecondaryPreviews) {
                Bitmap frame = Bitmap.createBitmap(mTextureView.getWidth(), mTextureView.getHeight(), Bitmap.Config.ARGB_8888);
                mTextureView.getBitmap(frame);
                mSecondaryPreview.setImageBitmap(frame);
            }
        }
    };

如您所见,必须从TextureView中读取每一帧,提取位图,然后设置其他3个ImageView流的位图。我最初尝试在非常慢的UI线程上执行此操作,然后尝试将其提交给具有更好帧速率的后台处理程序,但由于负载导致应用崩溃的问题很多。

谢谢

编辑

因此,为了裁剪预览的底部0.4375,我将ttmp更改为

    float[] ttmp = {
            0.0f, 1.0f,
            1.0f, 1.0f,
            0.0f, 0.4375f,

            0.0f, 0.4375f,
            1.0f, 1.0f,
            1.0f, 0.4375f,

            0.0f, 1.0f,
            1.0f, 1.0f,
            0.0f, 0.4375f,

            0.0f, 0.4375f,
            1.0f, 1.0f,
            1.0f, 0.4375f,

            0.0f, 1.0f,
            1.0f, 1.0f,
            0.0f, 0.4375f,

            0.0f, 0.4375f,
            1.0f, 1.0f,
            1.0f, 0.4375f,

            0.0f, 1.0f,
            1.0f, 1.0f,
            0.0f, 0.4375f,

            0.0f, 0.4375f,
            1.0f, 1.0f,
            1.0f, 0.4375f
    };

但这没有达到预期的效果

greeble31

因此,如果您可以GLSurfaceView本问题一样使用相机预览,则只需再添加6个多边形,就可以再制作3个副本。让我解释一下它们的布局。vtmpttmp分别以以下GL_TRIANGLE_STRIP形式描述两个三角形的矢量坐标和纹理坐标

float[] vtmp = {
    1.0f, 1.0f,    //Top right of screen
    1.0f, -1.0f,    //Bottom right of screen
    -1.0f, 1.0f,    //Top left of screen
    -1.0f, -1.0f    //Bottom left of screen
};

float[] ttmp = {
    1.0f, 1.0f,     //Top right of camera surface
    0.0f, 1.0f,     //Top left of camera surface
    1.0f, 0.0f,     //Bottom right of camera surface
    0.0f, 0.0f      //Bottom left of camera surface
};

步骤1:让我们将基本类型更改为GL_TRIANGLES,因为使用a会很困难GL_TRIANGLE_STRIP

//This also includes a fix for the left/right inversion:
float[] vtmp = {
    //Triangle 1:
    -1.0f, -1.0f,
    -1.0f, 1.0f,
    1.0f, 1.0f,

    //Triangle 2:
    1.0f, -1.0f,
    -1.0f, 1.0f,
    1.0f, 1.0f
};

float[] ttmp = {
    //Triangle 1:
    0.0f, 1.0f,
    1.0f, 1.0f,
    0.0f, 0.0f,

    //Triangle 2:
    0.0f, 0.0f,
    1.0f, 1.0f,
    1.0f, 0.0f
};

pVertex = ByteBuffer.allocateDirect(12*4).order(ByteOrder.nativeOrder()).asFloatBuffer();
(...)
pTexCoord = ByteBuffer.allocateDirect(12*4).order(ByteOrder.nativeOrder()).asFloatBuffer();
(...)
GLES20.glDrawArrays(GLES20.GL_TRIANGLES, 0, 6);    //Careful: Multiple changes on this line
(...)

如果第1步顺利进行,那么让我们在第2步中添加额外的三角形:

float[] vtmp = {
    //Triangle 1:
    -1.0f, 0.0f,
    -1.0f, 1.0f,
    0.0f, 0.0f,

    //Triangle 2:
    0.0f, 0.0f,
    -1.0f, 1.0f,
    0.0f, 1.0f,

    //Triangle 3:
    0.0f, 0.0f,
    0.0f, 1.0f,
    1.0f, 0.0f,

    //Triangle 4:
    1.0f, 0.0f,
    0.0f, 1.0f,
    1.0f, 1.0f,

    //Triangle 5:
    0.0f, -1.0f,
    0.0f, 0.0f,
    1.0f, -1.0f,

    //Triangle 6:
    1.0f, -1.0f,
    0.0f, 0.0f,
    1.0f, 0.0f,

    //Triangle 7:
    -1.0f, -1.0f,
    -1.0f, 0.0f,
    0.0f, -1.0f,

    //Triangle 8:
    0.0f, -1.0f,
    -1.0f, 0.0f,
    0.0f, 0.0f
};

float[] ttmp = {
    //This is the same as in Step 1, but duplicated 4 times over:
    //Triangle 1:
    0.0f, 1.0f,
    1.0f, 1.0f,
    0.0f, 0.0f,

    //Triangle 2:
    0.0f, 0.0f,
    1.0f, 1.0f,
    1.0f, 0.0f,

    //Triangle 3:
    0.0f, 1.0f,
    1.0f, 1.0f,
    0.0f, 0.0f,

    //Triangle 4:
    0.0f, 0.0f,
    1.0f, 1.0f,
    1.0f, 0.0f,

    //Triangle 5:
    0.0f, 1.0f,
    1.0f, 1.0f,
    0.0f, 0.0f,

    //Triangle 6:
    0.0f, 0.0f,
    1.0f, 1.0f,
    1.0f, 0.0f,

    //Triangle 7:
    0.0f, 1.0f,
    1.0f, 1.0f,
    0.0f, 0.0f,

    //Triangle 8:
    0.0f, 0.0f,
    1.0f, 1.0f,
    1.0f, 0.0f
};

pVertex = ByteBuffer.allocateDirect(48*4).order(ByteOrder.nativeOrder()).asFloatBuffer();
(...)
pTexCoord = ByteBuffer.allocateDirect(48*4).order(ByteOrder.nativeOrder()).asFloatBuffer();
(...)
GLES20.glDrawArrays(GLES20.GL_TRIANGLES, 0, 24);
(...)

本文收集自互联网,转载请注明来源。

如有侵权,请联系 [email protected] 删除。

编辑于
0

我来说两句

0 条评论
登录 后参与评论

相关文章

如何以最有效的方式检查相同的数组?

Excel VBA宏-如何以最有效的方式合并2张工作表

如何以最有效的方式在neo4j图中创建一对多关系?

如何以最有效的方式迭代 List 并为其设置数据?

如何以最有效的方式在大量文件中搜索搜索词?

如何以最有效的方式计算最密集的利润组合?

如何以最有效的方式提取ViewContainerRef和ComponentRef?

如何以最有效的方式在数组中添加元素?

如何以最有效的方式在 datagridview 中填充生成的列?

动态规划(如何以最有效的方式发送消息)

如何以最有效的方式刷新控制台?(蛇游戏 C++)

如何以最有效的方式获取字典列表中最大值的对应键?

如何以最有效的方式完全调平(映射/减少/递归)未知深度的嵌套对象?

如何以有效的方式更新多维numpy数组的多个副本

如何以有效的方式创建二维 numpy 数组的相应元素的元组

如何以更有效的方式创建/索引该矩阵?

最有效的进口方式

MySQL行的最有效方式?

最有效的文件加密方式?

如何以有效方式倍增数据帧

如何以有效的方式删除海龟列表

如何以更有效的方式编写排序?

如何以更有效,更短的方式编写Javascript

如何以更有效的方式编写此代码?

如何以最有效的方式在 Map<String, String> 中找到以其他字符串开头的字符串

给定两个列表/向量,其中一个是另一个的子集,如何以最有效的方式对齐它们?

如何以最有效的方式将两个未排序的数组合并为一个已排序的数组?

预览创建布局programmaticaly时streched在Camera2 API

创建以下MATCH语句的最有效方式是什么,为什么?