web-dev-qa-db-fra.com

Comment utiliser le décodage vidéo accéléré par matériel sur Android?

J'ai besoin d'un décodage H.264 accéléré par matériel pour un projet de recherche, afin de tester un protocole auto-défini.

Comme j'ai Recherche sur le Web, j'ai trouvé quelques façons d'effectuer un décodage vidéo accéléré par matériel sur Android.

  1. Utilisez ffmpeg libstagefright ( présentation de libstagefright ) ou utilisez directement libstagefright dans le système d'exploitation, comme ici .
  2. Utilisez OpenMax sur une plate-forme matérielle spécifique. comme ici sur l'appareil Samsung et ici sur la série Qualcomm Snapdragon
  3. Certaines personnes ont mentionné PVplayer ,

Certaines personnes "dire" libstagefright est le seul moyen alors que les gars de Qualcomm ont réussi, évidemment.

Actuellement, je ne sais pas quel chemin pourrait fonctionner . Je suis un peu confus maintenant. Si tout pouvait fonctionner, je préférerais certainement une méthode indépendante du matériel.

Comme j'ai testé quelques lecteurs vidéo de leur accélération H/W avec Galaxy Tab 7.7 (3.2 et Enxyos), VLC, Mobo, Rock, vplayer, rock et mobo fonctionnent bien, VLC ne fonctionne pas, vplayer semble avoir un rendu bug qui coûte ses performances.

Quoi qu'il en soit, j'ai fait une "opération" sur Rockplayer et supprimé toutes ses bibliothèques .so dans data\data\com.redirecting\rockplayer, et le décodage logiciel se bloque tandis que le décodage hw fonctionne toujours bien! Je me demande comment ils ont fait ça. Il me semble que l'accélération matérielle pourrait être indépendante des plates-formes matérielles.

Quelqu'un peut-il résoudre ce problème? Ou fournir une référence avec des informations supplémentaires ou de meilleurs détails?

31
Glenn Yu

Pour répondre à la question ci-dessus, permettez-moi de vous présenter quelques concepts liés à Android

OpenMAX Android utilise OpenMAX pour l'interface de codec. Par conséquent, tous les codecs natifs (accélérés par le matériel ou non) fournissent une interface OpenMAX. Cette interface est utilisée par StageFright (framework Player) pour décoder les médias à l'aide du codec

NDK Android permet aux applications Java d'interagir avec les bibliothèques natives C/C++ sous-jacentes à l'aide de NDK. Cela nécessite l'utilisation de JNI (Java Native Interface).

Passons maintenant à votre question How to tap native decoder to decode raw video bitstream?

Dans les versions Android 4.0 et inférieures, Android ne permettait pas d'accéder aux décodeurs vidéo sous-jacents au niveau de la couche Java. Vous auriez besoin d'écrire du code natif pour interagir directement avec le décodeur OMX. Bien que cela soit possible, ce n'est pas anodin car il faudrait savoir comment fonctionne OMX et comment mapper cet OMX à une application utilisant NDK.

Dans la version 4.1 (version Jelly bean), Android semble fournir un accès aux décodeurs à accélération matérielle au niveau de l'application via les API Java. Plus de détails sur les nouvelles API sur http://developer.Android.com/about/versions/Android-4.1.html#Multimedia

22
Oak Bytes

Vous voudrez peut-être essayer MediaExtractor et MediaCodec (Ils sont également disponibles dans NDK - AMediaExtractor et AMediaCodec - voir l'exemple pour jouer au .mp4 ici native-codec =)

1
GregoryK

Utilisez ExoPlayer ( github ).

C'est un projet open source sponsorisé par Google qui remplace MediaPlayer de la plateforme. Chaque composant du pipeline est extensible, y compris la source d'échantillon (comment les trames H.264 sont extraites de votre protocole personnalisé) jusqu'au rendu (vers une Surface, SurfaceTexture, etc.).

Il comprend une belle application de démonstration montrant l'utilisation .

1
Peter Tran