2011-04-26 8 views
6

J'essaye de créer un streamer audio avec MediaPlayer d'Android. C'est très bien si cela ne fonctionne pas avec Android 2.1 ou ci-dessous. Je dois être capable de lire l'audio à partir d'un flux SHOUTcast. Voici mon code:Diffusion audio avec Android MediaPlayer

player = new MediaPlayer(); 
try { 
player.setDataSource("http://87.230.103.107:8000"); 
player.prepareAsync(); 
} catch (IllegalArgumentException e) { 
// TODO Auto-generated catch block 
    e.printStackTrace(); 
} catch (IllegalStateException e) { 
// TODO Auto-generated catch block 
e.printStackTrace(); 
} catch (IOException e) { 
// TODO Auto-generated catch block 
e.printStackTrace(); 
} 
player.start(); 

Pour une raison quelconque, ce code ne jouera juste rien. Je pense que cela peut être lié aux autorisations de l'application. Est-ce que quelqu'un sait ce qui se passe?

Merci!

[UPDATE] Je reçois les erreurs suivantes:

04-25 23:35:15.432: ERROR/MediaPlayer(283): start called in state 4 
04-25 23:35:15.432: ERROR/MediaPlayer(283): error (-38, 0) 
04-25 23:35:15.602: ERROR/MediaPlayer(283): Error (-38,0) 
04-25 23:35:17.542: INFO/AwesomePlayer(33): calling prefetcher->prepare() 
04-25 23:35:18.547: INFO/Prefetcher(33): [0x17650] cache below low water mark, filling cache. 
04-25 23:35:18.762: INFO/AwesomePlayer(33): prefetcher is done preparing 
04-25 23:35:19.769: ERROR/AwesomePlayer(33): Not sending buffering status because duration is unknown. 
+0

L'exécutez-vous dans l'émulateur? J'ai eu des problèmes en cours d'exécution des médias dans l'émulateur avant. Essayez-le dans un appareil réel, peut-être que cela fonctionnera. – dmon

+0

Oui, je l'utilise sur l'émulateur. Dommage que je n'ai pas un vrai périphérique :( –

+0

Mon intuition est que c'est le problème. Quelqu'un d'autre pourrait avoir une autre prise. – dmon

Répondre

5

Désolé pour la réponse tardive, a couru à travers ce tout en cherchant des réponses à un autre problème.

Si vous avez encore besoin d'une réponse, vous appelez le start() alors qu'il est encore en cours de préparation. PrepareAsync() renvoie immédiatement, contrairement à prepare(). Le problème avec l'utilisation de 'prepare() `avec les flux est qu'il bloquera jusqu'à ce qu'il ait assez de données pour commencer à jouer.

Ce que vous voulez faire est de définir un OnPreparedListener, et le start() appelé à partir de là.

3

Le problème est que le streaming de type de contenu "audio/aacp" n'est pas pris en charge directement. Certaines bibliothèque de décodage peut être poursuivi en justice pour jouer "aacp", s'il vous plaît voir la solution ci-dessous:

Freeware Advanced Audio (AAC) Decoder for Android

How to use this library?

Pour plus de détails s'il vous plaît voir this.

Consider legal issues while using it.

  • le projet http://code.google.com/p/aacplayer-android/ est autorisé sous licence GPL, de sorte que vous pouvez créer des applications commerciales * au-dessus de, mais vous besoin de fullfill la GPL - principalement cela signifie publier votre code comme bien. * Si vous utilisez le second projet http://code.google.com/p/aacdecoder-android/, alors vous n'avez pas besoin de publier votre * code (la bibliothèque est sous licence LGPL).
-1

1) Éviter d'utiliser la préparation(), utiliser prepareAsyc() à la place. (ou) mettez votre logique de jeu dans un fil travaillé ou un fil séparé. 1) Évitez d'utiliser player.prepare(), utilisez à la place player.prepareAsync(); (Ou) garder la logique dans un fil séparé. (vous pouvez utiliser le service d'intention, AsyncTask, etc)

2) Essayez également avec le constructeur statique MediaPlayer.create (Uri);