2017-01-03 3 views
0

ich einen Blick auf die BigFlake Beispiele für Videocodierung unter, nämlich diese:Android Kamera Codierung durch OpenGL

http://bigflake.com/mediacodec/EncodeAndMuxTest.java.txt

Und ich frage mich, ob diese Methode grundsätzlich schneller ist als nur Methode onPreviewFrame aus das CameraCallback-Objekt selbst, um die Rohbytes des Bildes abzurufen und sie dem Encoder zuzuführen.

Wenn dies der Fall ist, kann mir dann jemand erklären, warum das schneller ist?

+0

War neugierig selbst, aber ich sehe onCameraPreview nicht in der Android-Dokumentation. Worauf beziehen Sie sich? –

+0

es heißt 'onPreviewFrame' eigentlich https://developer.android.com/reference/android/hardware/Camera.PreviewCallback.html – MichelReap

Antwort

1

Beide ja und nein, je nachdem, was Sie tun.

Wenn Sie die rohen Bytes aus dem Kameravorschau-Callback erhalten, müssen die Pixeldaten vom Medienserverprozess in den Prozess Ihrer App und von Ihrer App zurück in den Medienserverprozess in den Encoder übertragen werden. Die Pixeldaten werden vollständig im YUV-Format gespeichert, aber Ihre App muss sie möglicherweise von einem YUV-Layout in ein anderes konvertieren (Encoder können Pixeldaten in einigen verschiedenen Formaten akzeptieren, die nicht unbedingt die gleichen sind wie die Kamera bietet in der öffentlichen API).

Wenn Sie die Frames von der Kamera über EGL/OpenGL an den Encoder übergeben, müssen die eigentlichen Pixeldaten nicht in Ihren Prozess einfließen, sondern werden in undurchsichtigen Oberflächen gespeichert, wobei alle Formatkonvertierungen von der Grafikhardware übernommen werden . Dies beinhaltet einerseits das Konvertieren der Pixeldaten von YUV von der Kamera in RGB, wenn sie durch OpenGL gehen, zurück in YUV, wenn zum Codierer gegangen wird, aber all dies wird abstrahiert.

Je nach Qualität und Menge der Optimierungen, die für die Kameratreiber und EGL/OpenGL-Treiber ausgegeben wurden, kann dieser Ansatz wahrscheinlich genauso schnell oder schneller sein. Vor allem, wenn Sie die Bilddaten bearbeiten möchten, wenn dies in einem GL-Shader möglich ist. Der Callback-Ansatz für die Kameravorschau scheint einfacher zu sein, hat jedoch einen hohen Aufwand, um die Daten in den Prozess Ihrer App zu leiten.

+0

Ich sehe so seine gerade tatsächlich die Bytes übergeben, die den Overhead verursacht? Ich denke auch, dass der Kodierungsprozess auf der nativen (wie in C-Code) Ebene stattfindet, da manchmal ein SIGENV/libc-Fehler beim Kodieren ausgelöst wird. Vielleicht trägt es auch dazu bei, diese "Geschwindigkeit" zu reduzieren? – MichelReap

+0

Das Übergeben der Bytes von einem Prozess zu einem anderen ist ein Teil davon, ja, und das Übergeben der Bytes in ein Java-Byte-Array ist ein anderes. (Mit der neueren Camera2-API können Sie die Frames in direkten Byte-Puffern erhalten, die möglicherweise etwas weniger Overhead haben sollten). Und dann, wenn Sie die Daten an den Encoder zurückgeben, tun Sie dasselbe in umgekehrter Reihenfolge. Wenn die Pixeldaten jedoch für Sie verfügbar sind, müssen Sie sie in eines der öffentlichen Standardpixellayouts in der Kamera-API konvertieren, solange sie wie im OpenGL-Fall verborgen sind, kann sie in jedem beliebigen Format bleiben Hardware bevorzugt. – mstorsjo

+0

mit "Pixel-Layouts" meinst du das Farbformat wie NV21, NV19, etc.? – MichelReap