Android Video Player mit NDK, OpenGL ES und FFmpeg

Ok so hier ist was ich bisher habe Ich habe FFmpeg auf Android gebaut und kann es gut machen. Ich konnte ein Video in FFmpeg laden, nachdem ich den gewählten Dateinamen von der Java-Seite übergeben hatte. Um auf Leistung zu sparen, schreibe ich Video-Player in der NDK anstatt Passing Frames von FFmpeg zu Java über JNI. Ich möchte Frames aus dem Video auf eine OpenGL-Oberfläche senden. Ich habe Schwierigkeiten, herauszufinden, wie man jeden Rahmen von Video bekommt und es auf die OpenGL-Oberfläche macht. Ich habe mich bemüht, dies für ein paar Wochen jetzt ohne Glück herauszufinden. Hoffentlich kann mir jemand in die richtige Richtung zeigen.

Vielen Dank!

  • Android: Color To Int Konvertierung
  • Füge zwei Abschnitte in recyclerview android hinzu
  • Wie benutzt man Android ViewPager?
  • Xamarin Shared Projects vs Portable Klassenbibliotheken
  • Das letzte geänderte Datum der Datei erhalten
  • Wie zu lösen java.lang.OutOfMemoryError Probleme in Android
  • Picasso: aus dem Gedächtnis
  • CookieSyncManager :: createInstance () muss vor CookieSyncManager :: getInstance () aufgerufen werden
  • App stirbt mit "Sendesignal", aber keine Ausnahme oder andere Infos
  • Benutzerdefinierte Hintergrundfarbe für ausgewählte Artikel mit "activatedBackgroundIndicator" Navigationsschublade
  • Wie kann ich die Kamera-Vorschau manipulieren?
  • Höhe von ListView füllt den ganzen Bildschirm, obwohl als wrap_content gesetzt
  • One Solution collect form web for “Android Video Player mit NDK, OpenGL ES und FFmpeg”

    Eine Möglichkeit, die in den Sinn kommt, ist, die Pixel deines Rahmens in eine Textur zu zeichnen und diese Textur dann mit OpenGL zu rendern.

    Ich schrieb einen Blog-Post eine Weile zurück, wie man darüber geht, vor allem für Old-Skool-Pixel-basierte Videospiele, aber es gilt auch für Ihre Situation. Die Post ist Android Native Coding in C , und ich habe ein Github Repository mit einem Beispiel . Mit dieser Technik habe ich in der Lage, 60 FPS, auch auf der ersten Generation Hardware zu bekommen.

    EDIT über glTexImage2D vs glTexSubImage2D für diesen Ansatz.

    Wenn Sie glTexImage2D anrufen, wird der Videospeicher für Ihre Textur zugewiesen und kopiert die Pixel, die Sie in diesen Speicher übergeben (wenn Sie NULL nicht passieren). Das Aufrufen von glTexSubImage2D aktualisiert die Pixel, die Sie in einer bereits zugeordneten Textur angeben.

    Wenn du die ganze Textur aktualisierst, dann gibt es wenig Unterschied beim Aufrufen der einen oder anderen, tatsächlich ist GlTexImage2D in der Regel schneller. Aber wenn man nur einen Teil der Textur aktualisiert, gewinnt glTexSubImage2D die Geschwindigkeit.

    Sie müssen Power-of-2 Texturgrößen verwenden, so dass bei der Abdeckung der Bildschirm auf Hi-Res-Geräte erfordert eine 1024×512 Textur und eine 512×512 Textur auf mittlere Auflösungen. Die Textur ist größer als der Bildschirmbereich (Hi-Res ist 800×400-ish), was bedeutet, dass man nur einen Teil davon aktualisieren muss, also ist glTexSubImage2D der Weg zu gehen.

    Das Android ist ein Google Android Fan-Website, Alles ├╝ber Android Phones, Android Wear, Android Dev und Android Spiele Apps und so weiter.