Android: how to display Kamera-Vorschau mit callback?

Was ich tun muss, ist ganz einfach, ich will manuell Vorschau von der Kamera mit Kamera-Rückruf und ich wollen mindestens 15 fps auf einem echten Gerät. Ich Brauch nicht mal die Farben, ich brauche nur ein Vorschau-Bild in Graustufen.
Bilder aus der Kamera im YUV-format, und Sie haben, um es zu verarbeiten, irgendwie, das ist die wichtigste performance-problem. Ich bin mit API 8.

In allen Fällen bin ich mit Kamera.setPreviewCallbackWithBuffer(), dass ist schneller als die Kamera.setPreviewCallback(). Es scheint, dass ich kann nicht über 24 fps hier, wenn ich mich nicht Anzeige der Vorschau. Es ist also nicht das problem.

Habe ich versucht diese Lösungen:

1. Display-Kamera-Vorschau auf einem SurfaceView als Bitmap. Es funktioniert, aber die Leistung wird über 6fps.

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. Display-Kamera-Vorschau auf eine GLSurfaceView als textur. Hier war ich der Anzeige nur die Luminanz-Daten (Graustufen-Bild), die ist ganz einfach, es erfordert nur eine arraycopy() auf jedem Bild. Ich kann über 12fps, aber ich muß auch anwenden bestimmter Filter auf das Album und es scheint, dass es nicht getan werden kann schnell in OpenGL ES 1. So kann ich nicht diese Lösung verwenden. Einige details dieser in eine andere Frage.


3. Display-Kamera-Vorschau auf eine (GL)SurfaceView mit NDK zum verarbeiten der YUV-Daten. Ich finde eine Lösung hier , verwendet einige C-Funktion und NDK. Aber ich schaffte es nicht, es zu benutzen, hier einige weitere details. Aber wie auch immer, diese Lösung wird getan, um zurückzukehren, ByteBuffer, um es anzuzeigen als textur in OpenGL und es wird nicht schneller sein als die vorherigen Versuch. Also ich würde ändern müssen, um es zurück int [] - array, das gezeichnet werden kann, mit Leinwand.drawBitmap(), aber ich verstehe nicht, C genug, dies zu tun.


So, gibt es eine andere Möglichkeit, die ich bin fehlt oder einige Verbesserungen, um die versuche habe ich schon versucht?

InformationsquelleAutor der Frage Jaa-c | 2011-12-02

Schreibe einen Kommentar