2016-06-07 18 views
2

Ich muss ein Video aufnehmen, das nur einen einzigen Frame enthält: ein vom Benutzer angegebenes Bild (es kann beliebig lang sein, aber es hat nur das gleiche statische Bild). Also dachte ich, ich könnte den neuen MediaRecorder.VideoSource.SURFACE verwenden und einfach auf die Oberfläche zeichnen, die vom Rekorder benutzt wird. Ich initialisiere den Recorder richtig, und ich kann MediaRecorder.getSurface() ohne Ausnahme (etwas, das anscheinend schwierig ist) sogar aufrufen.Erforderlich, um zu der von MediaRecorder verwendeten Oberfläche zu zeichnen

Mein Problem ist etwas peinlich: Ich weiß nicht, was ich mit der Oberfläche tun soll zurückgegeben. Ich muss es irgendwie zeichnen, aber alle Beispiele, die ich finden kann, beziehen sich auf ein SurfaceView. Wird diese Oberfläche von MediaRecorder.setPreviewDisplay() verwendet? Wie zeichne ich etwas dazu?

Antwort

0

Theoretisch können Sie Surface#lockCanvas() verwenden, um ein Canvas zum Zeichnen zu erhalten, wenn Sie in Software rendern möchten. Früher gab es auf einigen Plattformen problems with this; nicht sicher, ob das behoben wurde.

Die andere Option besteht darin, eine EGL-Oberfläche von der Oberfläche zu erstellen und mit OpenGL ES darauf zu rendern. Sie können Beispiele dafür mit Code zum Verwalten der gesamten EGL-Konfiguration in Grafika finden.

Die GLES-Aufzeichnungsbeispiele verwenden MediaCodec anstelle von MediaRecorder, aber die Idee ist die gleiche und sie sollte mit MediaRecorder viel einfacher sein.

+0

Ich habe es gerade versucht: Nachdem die Aufnahme gestartet wurde, rief ich lockCavas() an, zeichnete eine Linie auf der Zeichenfläche und nannte dann unlockAndPostCanvas(). Als ich jedoch die Aufzeichnung gestoppt habe, habe ich eine RuntimeException bekommen, die laut Dokumentation bedeutet, dass keine gültigen Daten für die Aufzeichnung empfangen wurden. Ich habe das Problem der falschen Farbverschiebung nicht wie in dem von Ihnen geposteten Link gefunden. Irgendwelche Ideen? –

+0

Farbkanalumkehr ist ein mögliches Ergebnis; völliges Versagen ist ein anderes. Klingt so, als müssten Sie die GLES-Route gehen. (Es ist möglich, Software-Rendering zu verwenden, um ein Bitmap außerhalb des Bildschirms zu erstellen, das Bitmap als Textur mit 'glTexImage2D()' zu laden und das ... zu rendern, so dass Sie nicht das gesamte Rendering in GLES-Befehle konvertieren müssen.) Wenn Sie mit dem Code in Grafika beginnen, und nur 'glClear()' und die Schere rect, um farbige Rechtecke auf dem Bildschirm zu zeichnen, sollte es möglich sein, Dinge zu testen, ohne mehr als nur Ihre Zehen in GLES einzutauchen. – fadden