Gibt es eine schnellere Video-Rendering-Lösung als die Verwendung von AndroidBitmap_xxx-Funktionen?

9

In meinem nativen Thread habe ich FFMpeg, um Frames zu bekommen und zu entschlüsseln und sie dann in eine Warteschlange zu legen.

Auf der Java-Seite habe ich eine GLSurfaceView und von Renderer.onDrawFrame rufe ich in den nativen Code und übergebe eine Bitmap (diese Bitmap erstelle ich nur einmal und übergebe sie dann jedes Mal).

Im nativen Code bekomme ich den Kopf der Warteschlange, kopiere Daten in die Java-Bitmap mit Hilfe von AndroidBitmap_xxx -Funktionen und rendere dann dieses Bitmap auf der Java-Seite als Textur.

Ich frage mich, gibt es eine schnellere Möglichkeit, Video zu rendern? Soll ich es komplett im nativen Code machen, wenn ja, warum wird es schneller?

Bearbeiten: Ich kopiere jetzt keine RGB-Rahmenpixel in die gesperrten Bitmap-Pixel, sondern decide YUV-Rahmen direkt in die gesperrten Bitmap-Pixel. Dies macht das Rendering deutlich schneller (weil kein unnötiges memcpy mehr) immer noch die Frage bleibt.

    
Alexander Kulyakhtin 22.06.2012, 23:04
quelle

1 Antwort

2

Die effektivste Technik zum Ändern der Pixel in der Textur heißt Render-to-Texture und kann in OpenGL / OpenGL ES über FBOs . Auf Desktop-OpenGL können Sie Pixel-Pufferobjekte ( PBOs ) verwenden, um Pixeldaten direkt auf der GPU zu bearbeiten (OpenGL ES unterstützt dies jedoch nicht) dies noch).

Bei nicht gedehntem OpenGL können Sie die Pixel im Systemspeicher ändern und dann die Textur mit glTexImage2D / glTexSubImage2D aktualisieren - aber das ist eine ineffiziente Lösung für den letzten Ausweg und sollte nach Möglichkeit vermieden werden. glTexSubImage2D ist normalerweise viel schneller, da Pixel nur innerhalb der vorhandenen Textur aktualisiert werden, während glTexImage2D eine völlig neue Textur erzeugt (als Vorteil können Sie die Größe und das Pixelformat der Textur ändern). Auf der anderen Seite erlaubt glTexSubImage2D nur Teile der Textur zu aktualisieren.

Sie sagen, dass Sie wollen, dass es mit OpenGL ES funktioniert, also würde ich vorschlagen, die folgenden Schritte auszuführen:

  • Ersetze glTexImage2D () durch glTexSubImage2D () - wenn du genug Leistung hast, lass es einfach sein;
  • implementieren Render-to-Textur mit FBOs und Shadern - es wird benötigt viel mehr Arbeit, um Ihren Code neu zu schreiben, wird aber noch besser geben Leistung.

Für FBOs kann der Code wie folgt aussehen:

%Vor%

Beachten Sie, dass nicht alle Pixelformate gerendert werden können. RGB / RGBA sind normalerweise gut.

    
Sergey K. 25.07.2012, 10:04
quelle