Précédent   Forum des professionnels en informatique > Java > Général Java > Java & Mobiles > Android
Android Forum d'entraide sur Android, la plateforme mobile de Google pour téléphones portables et Smartphones. Avant de poster -> FAQ Android
Partagez cette discussion sur d'autres réseaux sociaux : Viadeo Twitter Google Facebook Digg Delicious MySpace Yahoo
Réponse Proposer ce sujet en actualité
 
Outils de la discussion
Publicité
'
Vieux 06/02/2012, 14h21   #1
Invité de passage
 
Inscription : septembre 2007
Messages : 22
Détails du profil
Informations forums :
Inscription : septembre 2007
Messages : 22
Points : 3
Points : 3
Par défaut Forcer la durée d'un morceau dans MediaPLayer

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
jeanvalery est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 08/02/2012, 15h41   #2
Responsable Android
 
Avatar de Feanorin
 
Inscription : avril 2004
Messages : 2 415
Détails du profil
Informations forums :
Inscription : avril 2004
Messages : 2 415
Points : 3 538
Points : 3 538
Envoyer un message via Skype™ à Feanorin
Bonjour,

Citation:
Si vous avez des suggestions, même sur un autre moyen de solutionner mon problème, je suis plus que preneur.
Pour la deuxième est ce que tu redéfinie le MediaPlayer lorsque tu as effectué un déplacement sur la Seek Bar ?
Après tu peux toujours regarder l'état de ton MediaPlayer pour voir si il bouge entre temps :/

Citation:
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é
Je ne pense pas , tout ce que tu peux c'est de travailler sur le flux. Le Flux te donnera la durée, mais pas l'inverse.
Feanorin est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 10/02/2012, 15h35   #3
Invité de passage
 
Inscription : septembre 2007
Messages : 22
Détails du profil
Informations forums :
Inscription : septembre 2007
Messages : 22
Points : 3
Points : 3
Bonjour et merci pour ces réponses,

Je ne redéfinis pas mon MediaPlayer quand je touche à la seekBar, j'appelle juste un seekTo, c'est ce que je trouve bizarre.

Par contre je regarderais bien l'état du MediaPlayer mais justement il ne me semble pas possible d’accéder à ces fameux états. A moins que tu ne parles d'autre chose.

Et quand tu dis que le flux me donnera la durée, justement c'est ce que je voudrais récupérer. Sauf que dans le cas d'un flux incomplet, il me semble bien difficile d'avoir une durée exact, surtout si c'est un flux variable bitrate non? La durée je ne la récupère qu'une fois le flux entièrement téléchargé?

Merci en tout cas pour ces réponses, je me sens un peu moins seul dans mon océan de questions
jeanvalery est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 10/02/2012, 16h45   #4
Responsable Android
 
Avatar de Feanorin
 
Inscription : avril 2004
Messages : 2 415
Détails du profil
Informations forums :
Inscription : avril 2004
Messages : 2 415
Points : 3 538
Points : 3 538
Envoyer un message via Skype™ à Feanorin
Citation:
surtout si c'est un flux variable bitrate non
... là c'est impossible.

Le seul moyen serait de le lire une fois (dans le code) pour avoir la durée puis le lancer normalement.

Citation:
Je ne redéfinis pas mon MediaPlayer quand je touche à la seekBar, j'appelle juste un seekTo, c'est ce que je trouve bizarre
Il doit forcément se perdre à un moment donnée...

Citation:
il ne me semble pas possible d’accéder à ces fameux états
Il faudrait essayer, je ne me rappelle plus ce que l'on peut avoir :/.
En debug tu dois bien pouvoir espionner la classe ?
Feanorin est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 12/02/2012, 13h04   #5
Invité de passage
 
Inscription : septembre 2007
Messages : 22
Détails du profil
Informations forums :
Inscription : septembre 2007
Messages : 22
Points : 3
Points : 3
En fait je ovulais éviter de le télécharger complètement avant de commencer à le lire, j'ai des morceaux (des conférences d'1h ou plus) que j'aimerais justement streamer... Donc pas de première lecture du flux sans téléchargement complet.

Ensuite, oui je peux espionner la classe mais il semble, après recherches, que les états du MediaPlayer soient volontairement cachés au developpeur... pas cool!

Pour la seekbar, je continue de cherche.

Merci
jeanvalery est déconnecté   Envoyer un message privé Réponse avec citation 00
Réponse Proposer ce sujet en actualité
Outils de la discussion



Fuseau horaire GMT +2. Il est actuellement 01h33.


 
 
 
 
Partenaires

Hébergement Web