Verwenden Sie MediaPlayer und MediaMetadataRetriever nicht in Android

Wie meine bescheidene Erfahrung zeigt, sind der native MediaPlayer, MediaMetadataRetriever und andere darauf basierende Klassen (z. B. VideoView, ThumbnailUtils) äußerst unzuverlässig. Möglicherweise liegt das Problem darin, dass sie nativ implementiert sind und von Version zu Version variieren, aber die Tatsache bleibt, dass ihr Verhalten auf verschiedenen Geräten nicht vorhergesagt werden kann und dies nicht einmal von der Leistung des Bügeleisens abhängt.

Ein gutes Beispiel war ein kleines Projekt, in dem die Videowiedergabe implementiert werden musste. Jedes Format und jeder Codec konnte gewählt werden, ich habe Tests mit mp4 und avi mit verschiedenen Codecs durchgeführt. Auf allen Geräten, die zur Hand kamen, verlief die Wiedergabe reibungslos und ohne Beanstandungen. Ältere Geräte und Betriebssystemversionen <4.0 mussten nicht unterstützt werden, und ich dachte, dass es mit diesen Formaten keine Probleme geben würde. Dann wurde auf dem HTC Desire V festgestellt, dass einige Videos nicht abgespielt wurden, der eingebaute Player in der Galerie ebenfalls. Es wurde angenommen, dass das Gerät eher schwach ist, aber die Überraschung war, dass auf dem Nexus 5 fast keine Testvideos abgespielt wurden. Obwohl ich keine Regelmäßigkeit feststellen konnte - selbst mit denselben Codecs konnte eine Datei gelesen werden und die andere nicht. Die Dateien waren nicht beschädigt, sodass nur der VideoView mit MediaPlayer sündigen konnte.

Glücklicherweise wurden gute Alternativen gefunden, die nicht nur zuverlässiger, sondern auch schneller funktionieren:

  • FFmpeg-Bibliothek. Sie können es mit dem Android NDK selbst kompilieren. Nun, aber die Nachteile dieses Ansatzes liegen auf der Hand - Sie müssen sich mit NDK auseinandersetzen, bauen und können dies nur unter Linux tun. Ich wollte keine Zeit damit verschwenden.
  • FFmpegMediaPlayer. Tatsächlich basiert es auf der ersten Bibliothek, Sie müssen sich jedoch nicht mit der Assembly befassen, und es ist bereits eine Schnittstelle vorhanden, die der des nativen MediaPlayer vollständig ähnlich ist. Nur zur Verifizierung habe ich versucht, es zu verwenden, aber aus irgendeinem Grund wurde das Video nicht auf SurfaceView gezeichnet, obwohl genau derselbe Code, aber es funktionierte ohne Probleme mit dem nativen MediaPlayer. Vielleicht war das meine Neigung, aber ich konnte keine schnelle Lösung finden.
    (UPD: Wie in den Kommentaren erwähnt, handelt es sich bei dieser Bibliothek nur um Audio.)
  • Vitamio. Nimmt auch FFmpeg als Basis und liefert auch fertige Baugruppen. Gleichzeitig verfügt es über ein eigenes VideoView und MediaMetadataRetriever mit einer Oberfläche, die der des nativen Android SDK ähnelt und das Leben beim Erstellen eines Players erheblich vereinfacht. Es ist möglich, eigene FFmpeg-Builds zu verwenden, OS 2.1+ und fast alle Formate werden unterstützt. Ich habe bei dieser Bibliothek angehalten, es traten keine Probleme auf. Bitte beachten Sie, dass in der Assembly zunächst kein Build für x86 vorhanden ist. Es ist auch zu erwarten, dass Ihr APK mit dieser Bibliothek ~ 8 Megabyte dick wird.
  • Es gibt noch andere Optionen, die meisten verwenden das gleiche FFmpeg, aber Vitamio hat mir vollkommen gepasst.

Im Allgemeinen empfehle ich dringend, keine Standardklassen zu verwenden, auch nicht für kleine Projekte und „gängige“ gängige Video- / Audioformate. Jemand kann anderer Meinung sein und sagen, dass alles gut für ihn funktioniert. Hier können Sie nur empfehlen, weitere Dateien und Geräte zu testen ... zum Beispiel mit Genymotion.

Jetzt auch beliebt: