Su Android, sto cercando di eseguire qualche elaborazione OpenGL sui fotogrammi delle telecamere, mostrare quei fotogrammi nell'anteprima della fotocamera e quindi codificare i fotogrammi in un file video. Sto cercando di farlo con OpenGL, usando GLSurfaceView e GLSurfaceView.Renderer e con FFMPEG per la codifica video.Utilizzo di oggetti Pixel Buffer (PBO) su Android
Ho elaborato con successo i fotogrammi dell'immagine utilizzando uno shader. Ora ho bisogno di codificare i frame elaborati in video. GLSurfaceView.Renderer fornisce il metodo onDrawFrame (GL10 ..). È in questo metodo che sto tentando di leggere i fotogrammi dell'immagine usando semplicemente glReadPixels() e quindi posizionare i fotogrammi su una coda per la codifica in video. A parte ciò, glReadPixels() è troppo lento - la mia frequenza dei fotogrammi è nelle singole cifre. Sto tentando di accelerare usando Pixel Buffer Objects. Questo non funziona. Dopo aver collegato il pbo, il frame rate rimane invariato. Questa è la mia prima volta che uso OpenGL e non so da dove cominciare a cercare il problema. Lo sto facendo bene? Qualcuno può darmi qualche indicazione? Grazie in anticipo.
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);
}
.
.
}
Hai controllato gli esempi di Google Grafika? Non sarei troppo sorpreso se queste implementazioni OpenGL fossero abbastanza vicine a quelle ottimali che puoi raggiungere su Android; vale a dire https://github.com/google/grafika/blob/master/src/com/android/grafika/RecordFBOActivity.java – harism
Per la chiamata a glReadPixels, prova a utilizzare glReadPixels (0, 0, larghezza, altezza, formato, GL_UNSIGNED_BYTE, 0); con zero passato alla fine, ma dovrai farlo tramite JNI, poiché java non consente nulla. Quindi usi il map buffer come al solito. –