Vista previa de la cámara Android en dos vistas (vista previa de cámara Multi-lentes)

Necesito dos previsualizaciones de cámara en mi aplicación. Sin embargo, la cámara de Android sólo puede dar una vista previa a la vez. ¿Hay alguna manera de hacer pipeline / copiar esa vista previa a otra vista? Me encontré con esta pregunta ¿Cómo crear lentes multi o vista previa con una cámara en Android y dice que

On Android 3.0 or later, you can use the setPreviewTexture method to pipe the preview data into an OpenGL texture, which you can then render to multiple quads in a GLSurfaceView or equivalent.

Pero no tengo ni idea de cómo hacer que a múltiples quads en GLSurfaceView . Necesito para apoyar android 4.0 +. Pero no quiero utilizar el marco de vista previa de la devolución de llamada de vista previa. Provoca un retraso significativo. Cualquier ayuda sería apreciada. ¡¡Gracias!!

Aquí está mi código para una sola vista previa

activity_main.xml

 <RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android" xmlns:tools="http://schemas.android.com/tools" android:layout_width="match_parent" android:layout_height="match_parent" android:background="@android:color/black" tools:context=".MainActivity" > <LinearLayout android:layout_width="match_parent" android:layout_height="match_parent" android:orientation="horizontal" android:weightSum="10" > <TextureView android:id="@+id/textureView1" android:layout_width="0dp" android:layout_height="match_parent" android:layout_weight="5" /> <TextureView android:id="@+id/textureView2" android:layout_width="0dp" android:layout_height="match_parent" android:layout_weight="5" /> </LinearLayout> </RelativeLayout> 

MainActivity.java

 public class MainActivity extends Activity implements SurfaceTextureListener{ private Camera mCamera; private TextureView mTextureView1; private TextureView mTextureView2; @Override protected void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); setContentView(R.layout.activity_main); mTextureView1 = (TextureView) findViewById(R.id.textureView1); mTextureView2 = (TextureView) findViewById(R.id.textureView2); mTextureView1.setSurfaceTextureListener(this); } @Override public void onSurfaceTextureAvailable(SurfaceTexture surface, int width, int height) { try { mCamera = Camera.open(getCameraId()); mCamera.setPreviewTexture(surface); CameraInfo cameraInfo = new CameraInfo(); Camera.getCameraInfo(getCameraId(), cameraInfo); setCameraDisplayOrientation(this, getCameraId(), mCamera); mCamera.startPreview(); } catch (Exception e) { e.printStackTrace(); } } @Override public boolean onSurfaceTextureDestroyed(SurfaceTexture surface) { try { mCamera.stopPreview(); mCamera.release(); } catch (Exception e) { e.printStackTrace(); } return true; } @Override public void onSurfaceTextureSizeChanged(SurfaceTexture surface, int width, int height) { } @Override public void onSurfaceTextureUpdated(SurfaceTexture surface) { } } 

Salida: Introduzca aquí la descripción de la imagen

Empiece enviando la vista previa de la cámara a SurfaceTexture en vez de a Surface asociada con una View. Que toma la salida de la cámara y lo hace disponible para su uso como una textura GLES.

Entonces, en lugar de tener dos TextureViews , sólo renderizar dos cuadrículas con textura GLES, cada uno de los cuales ocupa la mitad de una sola vista. Esto es más fácil que renderizar a dos superficies diferentes (solo un contexto EGL para preocuparse). Si no ha trabajado con OpenGL ES antes de que pueda haber un poco de una curva de aprendizaje.

Las piezas que necesitas se pueden encontrar en Grafika . Considere, por ejemplo, las actividades "Captura continua" y "Mostrar + cámara de captura". Ambos dirigen la salida de la cámara a SurfaceTexture y la hacen dos veces. Para estos, es una vez a la pantalla y una vez a la entrada de un codificador de vídeo, pero es la misma idea. Si nos fijamos en "Hardware scaler exerciser" se puede ver blitting un quad con textura que rebota alrededor de la pantalla, Puede utilizar esto como un ejemplo de cómo establecer el tamaño y la posición del quad.

También hay "doble decodificación", que está utilizando un par de TextureViews para mostrar dos películas decodificadas lado a lado. Usted no quiere hacer lo que hace – está recibiendo el contenido de dos fuentes diferentes, no mostrando una sola fuente dos veces.

Las diversas actividades utilizan GLES con TextureView , SurfaceView y GLSurfaceView . Cada tipo de vista tiene ventajas y limitaciones únicas.

Actualización: La nueva (más que esta respuesta) " textura de cámara " actividad es probablemente la más cercana a lo que desea. Envía la vista previa de la cámara a SurfaceTexture y muestra cómo mover, cambiar el tamaño, girar y ampliar la imagen, haciéndola con GLES.

  • Nueva visión API - Tamaño de imagen
  • La imagen de la aplicación de cámara personalizada de Android no aparece en la galería hasta que reinicie mi teléfono
  • Creación de mi propia aplicación de cámara + Captura automática de la imagen
  • Android: Transparente WebView sobre previsualización de cámara
  • androide muestran rectángulo en la cámara
  • LibGDX - Camera.update () llamada no hace nada
  • Cómo tomar fotos en la aplicación Android sin el interfaz de usuario ..?
  • Android ACTION_IMAGE_CAPTURE Propósito
  • Cómo comprobar la disponibilidad de telefonía y cámara para la versión de SDK <5
  • Cámara Qt QML a C ++ QImage en Android
  • ¿Por qué se rota una imagen capturada con la intención de la cámara en algunos dispositivos de Android?
  • FlipAndroid es un fan de Google para Android, Todo sobre Android Phones, Android Wear, Android Dev y Aplicaciones para Android Aplicaciones.