2016-03-27 21 views
5

Sto cercando di ottenere ogni fotogramma di un TextureView, purtroppo cercando:Ricevi un bitmap da TextureView efficiente

textureView.getBitmap(); 

risultati in un rallentamento delle prestazioni c'è un modo più veloce per ottenere una bitmap. È meglio usare invece NDK?

ricerca di esempi concreti

+0

Sei riuscito a rendere più veloce l'acquisizione di bitmap da TextureView? –

risposta

3

Un TextureView riceve fotogrammi su un SurfaceTexture, che prende frame inviati a sua superficie e li converte in una texture GLES. Per estrarre i dati del pixel, è necessario eseguire il rendering della texture su un framebuffer, quindi leggerlo con glReadPixels(). I dati dei pixel possono quindi essere avvolti con un oggetto Bitmap (che può o meno comportare la copia dei dati dei pixel).

L'utilizzo di NDK non ti farà molto bene, poiché tutto il codice che deve essere eseguito rapidamente è già implementato in modo nativo.

Potresti vedere dei miglioramenti inviando i dati direttamente a SurfaceTexture e facendo il lavoro di GLES, ma presumibilmente vuoi visualizzare i frame in entrata in TextureView, quindi tutto ciò che potresti salvare è il sovraccarico di Bitmap (che può o non può essere significativo).

Potrebbe essere d'aiuto se hai spiegato nella tua domanda da dove provengono i frame e che cosa vuoi fare con loro.

+0

Voglio eseguire alcune elaborazioni sul riconoscimento dell'immagine di think frame. Quindi il riconoscimento in tempo reale sui frame il problema adesso è che chiamare .getBitmap() richiede circa ~ 50-60 ms. Posso risolvere questo problema riducendo la bitmap più piccola che riduce il tempo, ma poi voglio anche ridisegnare i fotogrammi nella vista texture. Come proponesti di andare a fare il lavoro di GLES da solo? – AndyRoid

+0

Rendering GLES + 'glReadPixels()' dovrebbe essere molto più veloce. Se i tuoi requisiti di visualizzazione sono semplici (sopra il livello View o interamente sotto di esso) puoi semplicemente rendere la texture a SurfaceView. Quindi devi indirizzare i tuoi frame in ingresso a SurfaceTexture e rendere la texture a SurfaceView, chiamando 'glReadPixels()' prima di 'eglSwapBuffers()' per prendere una copia dei pixel. Questo ti darà un buffer di byte diretto con pixel RGB, che puoi usare da codice Java o C++. Non ho un esatto esempio da offrire, ma i vari pezzi possono essere trovati in Grafika (https://github.com/google/grafika). – fadden

+0

Grazie per la risposta dettagliata! – AndyRoid

-4

Un modo per ottimizzare è quello di eseguire in background in un compito asincrona come questo:

private class AsyncTaskRunner extends AsyncTask<> 
{ 

     @Override 
     protected void doInBackground() 
     { 

     // this is where you put long operations in background 
      textureView.getBitmap(); 

     } 
} 
+0

Avete già provato questo? – AndyRoid

+1

La tua risposta è completamente sbagliata dal momento che non puoi chiamare .getBitmap al di fuori del thread UI. – AndyRoid

+2

Inoltre, AsyncTask viene eseguito con una priorità più bassa, quindi non è una buona idea usarlo quando le prestazioni sono importanti. – fadden

Problemi correlati