【问题标题】:Camera2 API: can it output two cameras into same surface?Camera2 API:它可以将两个相机输出到同一个表面吗?
【发布时间】:2017-09-21 15:09:25
【问题描述】:

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

这完全可以使用 Camera2 API 吗?第一件事是指定在表面上投影的目标矩形,第二件事是两个相机是否可以使用单个表面作为输出。

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

谢谢

【问题讨论】:

    标签: android surface android-camera2


    【解决方案1】:

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

    如果您想这样做,您需要实现自己的合并,该合并从每个摄像头获取缓冲区,并将它们合成到一个输出中。

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

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

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

    【讨论】:

    • 很好的答案,很好地理解了我的问题。我认为是这样,并且我已经在使用 OpenGL 纹理测试解决方案。一个 OpenGL 上下文/线程能否将纹理渲染到两个目标表面 - 一个用于在屏幕上显示,另一个用于 MediaRecorder?
    • 是的,您只需要多个 EGL 窗口表面(一个用于输出视图,另一个用于 MediaRecoder),然后渲染到它们中;当您想要切换时,有一个 GL 调用可以绑定到不同的窗口表面。例如,一些视频聊天应用采用了这样的方法。
    【解决方案2】:

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

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

    【讨论】:

    • 该解决方案是我们已经使用的,但我询问将 2 个摄像头绘制到同一表面,以便 MediaRecorder 可以将其保存为一个视频文件。这不仅与显示有关,还用于保存视频或图像,并且只能从单个表面完成。
    • 哦,我现在明白了。嗯很有趣。我从未尝试过这样做。听起来你将不得不去定制,这可能是一个相当不错的规模任务。抱歉,这不是我做过的事情,也无法为您提供帮助。祝你好运。
    • 也许你能走运,找到一种方法来使用视频解析库将两者结合起来? code.google.com/archive/p/mp4parser 没用过这个,可能不是你需要的,只是提一下,以防引发想法。
    • 另外,你可以创建一个 API 来获取两个视频并将它们合并在一起,因为它们在 Linux 或 Windows 上的视频工具比在 Android 上要多得多。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2023-03-29
    • 2019-01-08
    • 2017-04-29
    • 1970-01-01
    相关资源
    最近更新 更多