Camera2 API: 它可以将两个相机输出到同一个表面吗?

Camera2 API: can it output two cameras into same surface?

我有特定要求将来自两个摄像头的信号连接到一个表面。每个摄像头将占满一半的表面。 表面将显示或驻留在 OpenGL 纹理中。

这完全可以使用 Camera2 API 吗?首先是指定投影到表面的目标矩形,其次是两个相机是否可以使用单个表面作为输出。

原因是我们的硬件将一张图片信号拆分成两个Android摄像头,需要在软件中将图片连接回去,这样包含两个摄像头图片的表面才有可能使用 MediaRecorder 保存为视频。

谢谢

我不确定我是否完全理解您的要求。所以你在任何时候都只能显示前置或后置摄像头,不能同时显示两者。但是,如果您将摄像头信号注入 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>

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

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

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

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

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

设置 Android EGL 环境的详细信息太长,无法放在这里,但应该有大量可用的示例。