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!

  • Warum ist Touchstart-Event nach Klick?
  • CyanogenMod auf Android Emulator - ist es möglich?
  • Aktualisieren Sie Daten in ListFragment als Teil von ViewPager
  • Android Pluralisierung funktioniert nicht, brauche Hilfe
  • Android Studio: Fehler beim Analysieren von XML & URI ist nicht registriert
  • Android AlertDialog setOnDismissListener für API niedriger als 17
  • Wie deaktiviere ich SSLv3 in Android für HttpsUrlConnection?
  • So erhalten Sie die Statusleiste Hintergrundfarbe, um colorPrimaryDark anzuzeigen
  • Wie erstelle ich API-Schlüssel für GCM?
  • Wie kann ich das Animations-Framework innerhalb der Leinwand verwenden?
  • Wie kann ich ein hochauflösendes Icon in eine Nicht-Amazon-AppStore Kindle Fire App einbetten?
  • Warum ist mein Button-Text zu allen CAPS auf Lollipop gezwungen?
  • 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.