Je suis en train de faire un lecteur audio qui lit les morceaux via un NAS à l'aide du protocol JSON-RPC, protocole qui n'autorise pas le streaming, ou alors j'ai pas bien cherché.
Du coup je télécharge le morceau en local et quand le buffer est assez rempli je lance la lecture du morceau via le MediaPlayer Android. La méthode prepare() récupère la durée du morceau déjà bufferisé, disons 10 secondes par exemple. Cela n’empêche pas la lecture du morceau jusqu'au bout mais pose problème quand je déplace mon curseur sur la seekbar. Pour éviter ça j'utilise en fait un Mediaplayer à moi qui extends le Mediaplayer standard, et auquel je passe une "duration" approximative calculée en fonction du nombre de bits téléchargés, du nombre de bits total du morceau et de la durée déjà dispo.
C'est approximatif car il suffit que le morceau soit en variable bitrate pour fausser le calcul, mais bon, ça marchotte.
Du coup j'ai deux questions :
1 - y a-t-il un moyen de forcer cette durée pour la mettre à la bonne valeur une fois que le morceau est complètement téléchargé?
2 - Quand je lis un morceau en cours de téléchargement, je peux déplacer mon curseur sur la seekbar, la lecture se poursuit bien à l'endroit souhaité. Par exemple, pour un morceau d'une durée finale de 10000, si je fais un seekTo(7000), ça marche. Par contre si je le fais une deuxième fois, (exemple seekTo(5000)), j'ai une erreur dans le logcat : Attempt to seek to past end of the file : request 5000, EOF 1200. Alors j'imagine que 1200 correspond à la taille du morceau bufferisé au moment où j'ai instancié le Mediaplayer, mais pour quoi est-ce que ça a marché la première fois et que ça plante à la deuxième?
Si vous avez des suggestions, même sur un autre moyen de solutionner mon problème, je suis plus que preneur.
Un grand merci d'avoir lu tout ça, en espérant qu'une âme charitable et savante passe par ici.
Jean





Répondre avec citation




Partager