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.
- Prevenga onPause de la basura OpenGL Context
- Android - GLSurfaceView EGL_BAD_ALLOC
- Tutorial para Android OpenGL ES
- La cámara aérea más baja de la CPU a GPU enfoque en Android
- Cómo implementar la funcionalidad de deshacer en opengl en android
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); } . . }
- Cómo detectar el clic en un objeto en OpenGL ES en la aplicación de Android?
- Render-a-textura y sincronización
- ¿Cómo funciona matrix.setlookatm?
- Android: Limpiar correctamente después de OpenGL
- Android OpenGL ES Tamaño de la textura Potencia de 2
- Por qué las funciones de OpenGL ES no se pueden llamar desde otro subproceso
- Cómo utilizar GLM en la aplicación Android NDK
- ¿Por qué la matriz generada por el frustumM de Android difiere de la de los Redbook?
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.
- Android ormlite NoClassDefFoundError en Samsung S4 API 21
- Android: cómo obtener un atributo personalizado de un XML en la clase de actividad