Uso de objetos de búfer de píxeles (PBO) en Android

En Android, estoy intentando realizar algún procesamiento de OpenGL en los fotogramas de la cámara, mostrar esos fotogramas en la vista previa de la cámara y luego codificar los fotogramas en un archivo de vídeo. Estoy intentando hacer esto con OpenGL, usando GLSurfaceView y GLSurfaceView.Renderer y con FFMPEG para la codificación video.

He procesado los fotogramas con un shader. Ahora necesito codificar los cuadros procesados ​​al vídeo. El GLSurfaceView.Renderer proporciona el método onDrawFrame (GL10 ..). Es en este método que estoy tratando de leer los marcos de imagen con sólo glReadPixels () y luego colocar los marcos en una cola para la codificación de vídeo. Por sí mismo, glReadPixels () es demasiado lento – mi velocidad de fotogramas está en los dígitos individuales. Estoy tratando de acelerar este uso de objetos Pixel Buffer. Esto no está funcionando. Después de conectar el pbo, la velocidad de fotogramas no cambia. Esta es la primera vez que uso OpenGL y no sé dónde empezar a buscar el problema. ¿Estoy haciendo esto bien? ¿Puede alguien darme alguna dirección? Gracias por adelantado.

public class MainRenderer implements GLSurfaceView.Renderer, SurfaceTexture.OnFrameAvailableListener { . . public void onDrawFrame ( GL10 gl10 ) { //Create a buffer to hold the image frame ByteBuffer byte_buffer = ByteBuffer.allocateDirect(this.width * this.height * 4); byte_buffer.order(ByteOrder.nativeOrder()); //Generate a pointer to the frame buffers IntBuffer image_buffers = IntBuffer.allocate(1); GLES20.glGenBuffers(1, image_buffers); //Create the buffer GLES20.glBindBuffer(GLES20.GL_ARRAY_BUFFER, image_buffers.get(0)); GLES20.glBufferData(GLES20.GL_ARRAY_BUFFER, byte_buffer.limit(), byte_buffer, GLES20.GL_STATIC_DRAW); GLES20.glBindBuffer(GLES20.GL_ARRAY_BUFFER, image_buffers.get(0)); //Read the pixel data into the buffer gl10.glReadPixels(0, 0, this.width, this.height, GL10.GL_RGBA, GL10.GL_UNSIGNED_BYTE, byte_buffer); //encode the frame to video enQueueForEncoding(byte_buffer); //unbind the buffer GLES20.glBindBuffer(GLES20.GL_ARRAY_BUFFER, 0); } . . } 

Como recuerdo glBufferData no es el mapeo de su buffer interno en la memoria GPU, sólo copia los datos de su memoria en el búfer (se inicializa). Para obtener acceso a la memoria que es asignada por glBufferData debe utilizar glMapBufferRange. Esta función devuelve el objeto Java Buffer que puede leer.

Nunca he intentado algo así antes (opengl + video enconding), pero puedo decirle que la lectura de la memoria del dispositivo es LENTO. Intente el búfer doble, esto puede ayudar puesto que la GPU puede continuar prestando al segundo almacenador intermediario mientras que el regulador de DMA lee detrás la materia.

Cargue un generador de perfiles (consulte el proveedor de GPU de sus dispositivos), esto puede darle una idea. Otra cosa que puede ayudar es establecer el formato de pbuffer interno a algo más, intente los números más bajos y dejar caer un canal (alfa).

EDIT: Si usted se siente así, puede codificar el video en la GPU, que va a impulsar, la memoria y el procesamiento, su aplicación.

  • XML FrameLayout ha bajado mi framerate OpenGL SurfaceView (fps)
  • ¿Cuál es la forma correcta de manejar el ciclo de vida de la actividad con OpenGL?
  • ¿Hay una mejor manera de depurar OpenGL que de llamar a glGetError después de cada comando?
  • Reduzca el uso de memoria para texturas en OpenGL ES 1.1
  • Extensiones de OpenGL ES 2.0 en dispositivos Android
  • ¿Qué significan los argumentos para frustum en OpenGL?
  • Android: ¿Cuándo se destruye el contexto de OpenGL?
  • Cómo forzar el modo de paisaje con NDK utilizando códigos C ++ puros
  • Crash con SurfaceView en Android NDK al pausar / reanudar la aplicación rápidamente
  • Escribir en tiempo real opengl-es de juego para Android - alguna pregunta (optimización)
  • ¿Cómo puedo determinar lo que se toca en el espacio 3D de la pantalla?
  • FlipAndroid es un fan de Google para Android, Todo sobre Android Phones, Android Wear, Android Dev y Aplicaciones para Android Aplicaciones.