Primo: ci sto lavorando da un po 'di tempo e ho provato diverse soluzioni, quindi non inviarmi il primo link che trovi su google.Android: come visualizzare l'anteprima della fotocamera con il callback?
Quello che devo fare è abbastanza semplice, voglio visualizzare manualmente l'anteprima dalla fotocamera utilizzando la funzione di richiamata della fotocamera e voglio ottenere almeno 15 fps su un dispositivo reale. Non ho nemmeno bisogno dei colori, ho solo bisogno di visualizzare l'immagine in scala di grigi. Le immagini dalla fotocamera sono in formato YUV e devi elaborarlo in qualche modo, che è il problema principale delle prestazioni. Sto usando l'API 8.
In tutti i casi sto usando camera.setPreviewCallbackWithBuffer(), che è più veloce di camera.setPreviewCallback(). Sembra che non riesca a ottenere circa 24 fps qui, se non visualizzo l'anteprima. Quindi non c'è il problema.
ho provato queste soluzioni:
1. Visualizzare anteprima della fotocamera su un SurfaceView come bitmap. Funziona, ma la prestazione è di circa 6 fps.
baos = new ByteOutputStream();
yuvimage=new YuvImage(cameraFrame, ImageFormat.NV21, prevX, prevY, null);
yuvimage.compressToJpeg(new Rect(0, 0, prevX, prevY), 80, baos);
jdata = baos.toByteArray();
bmp = BitmapFactory.decodeByteArray(jdata, 0, jdata.length); // Convert to Bitmap, this is the main issue, it takes a lot of time
canvas.drawBitmap(bmp , 0, 0, paint);
2. visualizzazione di anteprima della fotocamera su un GLSurfaceView come una texture. Qui stavo visualizzando solo i dati di luminanza (immagine in scala di grigi), che è abbastanza semplice, richiede solo un arraycopy() su ciascun fotogramma. Posso ottenere circa 12 fps, ma ho bisogno di applicare alcuni filtri per l'anteprima e sembra, che non può essere fatto velocemente in OpenGL ES 1. Quindi non posso usare questa soluzione. Alcuni dettagli su questo in another question.
3. Visualizzazione di anteprima della fotocamera su un (GL) SurfaceView utilizzando NDK per elaborare i dati YUV. Trovo una soluzione here che utilizza alcune funzioni C e NDK. Ma non sono riuscito a usarlo, here some more details. Ma comunque, questa soluzione è fatta per restituire ByteBuffer per visualizzarlo come una trama in OpenGL e non sarà più veloce del tentativo precedente. Quindi dovrei modificarlo per restituire l'array int [], che può essere disegnato con canvas.drawBitmap(), ma non capisco C abbastanza per farlo.
Quindi, c'è qualche altro modo che mi manca o qualche miglioramento rispetto ai tentativi che ho provato?
Grazie per qualsiasi risposta!
Grazie, ma ho davvero bisogno di usare il callback e visualizzare le immagini manualmente. Non ho bisogno solo dell'immagine in scala di grigi, sto usando altri filtri, che non ho menzionato nella mia domanda ... –