web-dev-qa-db-fra.com

Android MediaPlayer prend beaucoup de temps pour préparer et mettre en mémoire tampon

Mon application prend beaucoup de temps pour préparer et mettre en mémoire tampon un flux audio. J'ai lu cette question Pourquoi le MediaPlayer d'Android met-il tant de temps à préparer des flux en direct pour la lecture? Cependant, il est juste dit que les gens ont connu ce problème, il n’indique pas comment l’améliorer.

Je vis cela dans toutes les versions d'Android, testé de 2.2 - 4.1.2.

Les flux ont un débit approprié pour la connexion mobile et 3G. Il faut moins d’une seconde au même flux pour démarrer la mise en mémoire tampon dans l’application iOS équivalente.

Existe-t-il un moyen de spécifier la durée devant être mise en mémoire tampon? Je sais que l'application radio Tune In offre cette fonctionnalité ( https://play.google.com/store/apps/details?id=tunein.player ).

Merci.

Edit: J'ai de nouveau testé et constaté que cela ne se produit que sur les appareils exécutant Gingerbread et versions supérieures (> = 2.3). Je sais qu'Android a modifié le cadre sous-jacent d'OpenCore en StageFright. Alors, comment puis-je optimiser le cadre des médias? Il semble tout simplement faux que le vieux HTC Wildfire puisse préparer, diffuser et lire, soit 10 fois plus vite que le tout nouveau HTC One X et Nexus 7.

23
SteveEdson

J'ai lutté avec cette question pendant des mois. Enfin j'ai trouvé la solution.

Le vrai problème réside dans l'implémentation de la classe MediaPlayer. Notamment avec la façon dont MediaPlayer met les données en mémoire tampon. C'est pourquoi la solution consiste à créer votre propre mise en mémoire tampon, à l'enregistrer dans un fichier temporaire et à l'envoyer à MediaPlayer.

Ce tutoriel et le code source expliquent exactement comment. http://androidstreamingtut.blogspot.nl/2012/08/custom-progressive-audio-streaming-with.html

En adaptant ce code, il est facile de créer un meilleur lecteur de streaming.

Les développeurs Google ont vraiment merdé ici.

EDIT: Cette réponse est plutôt ancienne. Nowdays, je recommanderais de ne pas utiliser MediaPlayer et d'utiliser plutôt ExoPlayer. Il est extensible, stable et peut lire de nombreux types de supports. Vous pouvez le trouver ici: https://github.com/google/ExoPlayer/

Vous ne pouvez vraiment pas faire grand chose puisque la classe Android MediaPlayer ne permet pas d'accéder à des paramètres de niveau inférieur, tels que la taille de la mémoire tampon. La seule alternative serait de créer votre propre lecteur en utilisant AudioTrack et une bibliothèque comme FFmpeg pour effectuer le décodage.

9
William Seemann

La seule chose que je recommande est de jouer avec l'encodage. Par exemple, pour les MP4, assurez-vous que MOOV Atom se trouve au début du fichier (le nombre de questions sur S/O est suffisant pour savoir comment procéder avec ffmpeg, etc.). Avec les MP3, vous pouvez regarder différents codecs ou débits binaires par exemple.

Vous pouvez, par exemple, essayer un certain nombre de fichiers audio que vous trouvez en ligne et, si vous en voyez un qui ne met pas longtemps en mémoire tampon, essayez de coder vos fichiers de la même manière.

0
ajacian81