2015-09-22 7 views
5

Neue Kamera 2 API ist sehr verschieden von alten one.Showing die manipulierten Kamera Frames auf Benutzer Teil der Pipeline ist verwirrt mich. Ich weiß, dass es eine sehr gute Erklärung auf Camera preview image data processing with Android L and Camera2 API gibt, aber das Anzeigen von Frames ist immer noch nicht klar. Meine Frage ist, wie Frames auf dem Bildschirm angezeigt werden, die von der Callback-Funktion von ImageReaders nach einer gewissen Verarbeitung stammen, während Effizienz und Geschwindigkeit in der Camera2 API-Pipeline erhalten bleiben.Android Camera2 API zeigt verarbeitete Vorschaubild

Beispiel Fluss:

camera.add_target (imagereader.getsurface) -> auf imagereaders Rückruf einige Berechnungen durchführen ->

Umgehung Idea (zeigen, dass Bild auf dem Bildschirm bearbeitet?): Senden Bitmaps Imageview jedem Zeit neuer Rahmen bearbeitet.

+1

Versuchen Sie dies für jeden Vorschau-Frame oder nur einmal (z. B. für jede Standbildaufnahme mit hoher Auflösung)? Abhängig von der Rate und der Auflösung sind möglicherweise unterschiedliche Anzeigeansätze geeigneter. –

+0

Jeder Rahmen tatsächlich. Ich weiß, dass es Frames geben wird, die wegen des Zeitverlustes durch Bildverarbeitung nicht gezeigt werden können.Wenn das YUV Format mi 30 fps in der Vorschau liefert und ich 20 Frames von insgesamt 30 pro Sekunde verarbeiten kann, möchte ich diesen 20 Frame auf dem Bildschirm zeigen. – rcmalli

Antwort

11

Bearbeiten nach Klärung der Frage; Original-Antwort am Ende

Hängt davon ab, wo Sie Ihre Verarbeitung machen.

Wenn Sie RenderScript verwenden, können Sie eine Surface von einer SurfaceView oder einer TextureView mit einer Zuweisung verbinden (mit setSurface) und dann Ihre verarbeitete Ausgabe an diese Zuweisung schreiben und sie mit Allocation.ioSend() senden. Die HDR Viewfinder demo verwendet diesen Ansatz.

Wenn Sie EGL-Shader-basierte Verarbeitung durchführen, können Sie eine Surface mit einer EGLSurface mit eglCreateWindowSurface verbinden, mit dem Surface als native_window Argument. Dann können Sie Ihre endgültige Ausgabe an diese EGL-Oberfläche rendern und wenn Sie eglSwapBuffers aufrufen, wird der Puffer an den Bildschirm gesendet.

Wenn Sie eine native Verarbeitung durchführen, können Sie NDK ANativeWindow methods verwenden, um auf eine Oberfläche zu schreiben, die Sie von Java und convert an ein ANativeWindow übergeben.

Wenn Sie Java-Level-Verarbeitung machen, ist das wirklich langsam und Sie wahrscheinlich nicht wollen. Aber kann die neue Android M ImageWriter Klasse verwenden, oder laden Sie eine Textur auf EGL für jeden Frame.

Oder wie Sie sagen, zu einem ImageView jeden Rahmen zu zeichnen, aber das wird langsam sein.


Ursprüngliche Antwort:

Wenn Sie JPEG-Bilder werden aufnehmen, können Sie einfach den Inhalt des ByteBuffer von Image.getPlanes()[0].getBuffer() in eine byte[] kopieren und dann BitmapFactory.decodeByteArray verwenden Sie es in eine Bitmap zu konvertieren.

Wenn Sie YUV_420_888-Bilder erfassen, müssen Sie Ihren eigenen Konvertierungscode aus dem 3-Ebenen-Format YCbCr 4: 2: 0 in etwas schreiben, das Sie anzeigen können, z. B. ein int [] von RGB-Werten Bitmap von; Leider gibt es dafür noch keine praktische API.

Wenn Sie RAW_SENSOR-Bilder (unverarbeitete Bayer-Musterdaten) erfassen, müssen Sie eine ganze Menge Bildverarbeitung durchführen oder einfach eine DNG speichern.

+0

Wie ich gesagt habe, auf Frage habe ich gefragt, wie man das zeigt, lesen und verarbeitet Frames auf dem Bildschirm nicht, wie Datentypen konvertieren, aber trotzdem. – rcmalli

+0

aktualisierte Antwort, um die Frage hoffentlich zu entsprechen. –

+0

Sehr gut erklärt. Ich gehe davon aus, dass diese Antwort Leute führen wird, die eine neue API benutzen. Es tut mir leid wegen einer unklaren Frage zu Beginn. – rcmalli

Verwandte Themen