Camera2 API:它可以将两个摄像头输出到同一个表面吗?

时间:2017-09-21 15:09:26

标签: android surface android-camera2

我有特殊要求将两个相机的信号连接到一个表面。每个相机都会填满表面的一半。 表面将显示或驻留在OpenGL纹理中。

这是否可以使用Camera2 API?首先是指定表面投影的目标矩形,第二件事是两个摄像头可以使用单个表面作为输出。

原因是我们的硬件将一个图像信号分成两个Android摄像头,需要将图像连接回软件,因此包含两个摄像头图像的表面可能会使用MediaRecorder保存为视频。

由于

2 个答案:

答案 0 :(得分:1)

不直接。 Surface一次只能由一个生成源拥有,因此如果您在摄像机设备0的会话配置中包含特定Surface,尝试同时将它与摄像机设备1一起使用将在会话中出现错误创建相机设备1.

如果你想这样做,你需要实现自己的合并,它从每个摄像头接收缓冲区,并将它们合成为一个输出。

最有效的途径可能是通过GPU和OpenGL。简而言之,您需要创建一个OpenGL上下文和两个SurfaceTextures,每个相机输出一个。然后,您可以将EGLCreateWindowSurface与MediaRecorder Surface一起使用,以创建要绘制的输出EGL窗口。

此时,你可以用你想要的任何方式将两个输入纹理渲染到输出表面 - 它听起来像你想要的是两个并排的矩形,每个矩形都有一个摄像机的输出。

设置Android EGL环境的细节太长了,不能放在这里,但应该有大量可用的样本。

答案 1 :(得分:0)

我不确定我完全理解你的要求。所以你只能在任何时候显示前置或后置摄像头,你无法同时显示两者。但是,如果您将摄像头信号注入Android屏幕或进行流式传输,那么确定将屏幕分割为两个摄像头视图没有问题。

<?xml version="1.0" encoding="utf-8"?>
    <LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
    android:orientation="horizontal"
    android:layout_width="match_parent"
    android:layout_height="match_parent">

    <SurfaceView
        android:id="@+id/surfaceView1"
        android:layout_width="0dp"
        android:layout_weight="1"
        android:layout_height="match_parent"/>

    <SurfaceView
        android:id="@+id/surfaceView2"
        android:layout_width="0dp"
        android:layout_weight="1"
        android:layout_height="match_parent"/>

</LinearLayout>

但我不确定你想要完成什么,所以希望这会有所帮助。当然,即使我们均匀地隔开相机表面,您仍然需要完成工作以获得每个相机的最佳布局尺寸,并正确保持每个相机视图的纵横比。