wake-up-neo.net

Wie verwende ich hardwarebeschleunigte Videodekodierung auf Android?

Ich benötige eine hardwarebeschleunigte H.264-Dekodierung für ein Forschungsprojekt, um ein selbstdefiniertes Protokoll zu testen.

Da ich Search im Web habe, habe ich einige Möglichkeiten gefunden, um eine hardwarebeschleunigte Videodekodierung unter Android durchzuführen.

  1. Verwenden Sie ffmpeg libstagefright ( Übersicht über libstagefright ) oder verwenden Sie libstagefright direkt im Betriebssystem, wie hier .
  2. Verwenden Sie OpenMax auf einer bestimmten Hardwareplattform. wie hier über Samsung-Gerät und hier über Qualcomm Snapdragon-Serie
  3. Einige Leute erwähnten PVplayer ,

Einige Leute "sagen" libstagefright ist der einzige Weg, während Qualcomm-Jungs offensichtlich Erfolg haben.

Derzeit bin ich mir nicht sicher, wie das funktionieren könnte . Ich bin jetzt ein wenig verwirrt. Wenn alles funktionieren könnte, würde ich sicherlich eine hardwareunabhängige Methode bevorzugen.

Da ich einige Videoplayer auf ihre H/W-Beschleunigung mit Galaxy Tab 7.7 (3.2 & Enxyos) getestet habe, funktionieren VLC, Mobo, Rock, Vplayer, Rock und Mobo einwandfrei, VLC funktioniert nicht, Vplayer scheint ein Rendering zu haben Fehler, der seine Leistung kostet.

Wie auch immer, ich habe eine 'Operation' für Rockplayer durchgeführt und alle .so-Bibliotheken in data\data\com.redirecting\rockplayer gelöscht, und die Software-Dekodierung stürzt ab, während die Hardware-Dekodierung noch einwandfrei funktioniert! Ich frage mich, wie sie das gemacht haben. Es scheint mir, dass die Hardware-Beschleunigung unabhängig von Hardware-Plattformen sein könnte.

Kann jemand dieses Problem lösen? Oder eine Referenz mit zusätzlichen Informationen oder besseren Details versehen?

31
Glenn Yu

Um die obige Frage zu beantworten, möchte ich einige Konzepte im Zusammenhang mit Android vorstellen

OpenMAX Android verwendet OpenMAX als Codec-Schnittstelle. Daher bieten alle nativen Codecs (hardwarebeschleunigt oder anderweitig) eine OpenMAX-Schnittstelle. Diese Schnittstelle wird von StageFright (Player-Framework) zum Dekodieren von Medien mithilfe des Codecs verwendet

NDK Android ermöglicht Java Anwendungen die Interaktion mit zugrunde liegenden systemeigenen C/C++ - Bibliotheken mithilfe von NDK. Dies erfordert die Verwendung von JNI (Java Native Interface).

Nun zu deiner Frage How to tap native decoder to decode raw video bitstream?

In Version Android 4.0 und niedriger bot Android keinen Zugriff auf zugrunde liegende Videodecoder auf Java - Ebene. Sie müssten nativen Code schreiben, um direkt mit dem OMX-Decoder zu interagieren. Dies ist zwar möglich, aber nicht trivial, da Kenntnisse über die Funktionsweise von OMX und die Zuordnung dieser OMX zu einer Anwendung mithilfe von NDK erforderlich sind.

In 4.1 (Jelly Bean-Version) scheint Android über Java APIs den Zugriff auf hardwarebeschleunigte Decoder auf Anwendungsebene zu ermöglichen. Weitere Informationen zu neuen APIs finden Sie unter http://developer.Android.com/about/versions/Android-4.1.html#Multimedia

22
Oak Bytes

Möglicherweise möchten Sie MediaExtractor und MediaCodec ausprobieren (Sie sind auch in NDK verfügbar - AMediaExtractor und AMediaCodec - siehe Beispiel zum Abspielen von .mp4 hier native-codec =)

1
GregoryK

Verwenden Sie ExoPlayer ( github ).

Es ist ein von Google gesponsertes Open-Source-Projekt, das den MediaPlayer der Plattform ersetzt. Jede Komponente in der Pipeline ist erweiterbar, einschließlich der Beispielquelle (wie die H.264-Frames aus Ihrem benutzerdefinierten Protokoll extrahiert werden) für das Rendern (auf eine Oberfläche, eine Oberflächentextur usw.).

Es enthält eine Nizza Demo-App zeigt die Nutzung .

1
Peter Tran