2011-08-17 5 views
3

Après quelques recherches sur Google, il semble que ce soit un problème commun, mais je n'ai pas encore trouvé une solution réelle. Je n'ai pas testé sur un appareil réel, mais l'émulateur coupe mes clips sonores à environ 80% de mes performances. Je joue des fichiers .wav.Android 2.2 couper la lecture audio MediaPlayer?

Est-ce que quelqu'un connaît une solution programmatique à ces problèmes?

modifier:

public void play(Context context){ 
    if (soundPlayer != null){ 
     soundPlayer.release(); 
    } 

    int rId = 0; 

    switch(aIndex){ 
     case 0: rId = R.raw.c0; break; 
     case 1: rId = R.raw.c1; break; 
     case 2: rId = R.raw.c2; break; 
     case 3: rId = R.raw.c3; break; 
     case 4: rId = R.raw.c4; break; 
     case 5: rId = R.raw.c5; break; 
     case 6: rId = R.raw.c6; break; 
     case 7: rId = R.raw.c7; break; 
     case 8: rId = R.raw.c8; break; 
     case 9: rId = R.raw.c9; break; 
     case 10: rId = R.raw.c10; break; 
     case 11: rId = R.raw.c11; break; 
     case 12: rId = R.raw.c12; break; 
     case 13: rId = R.raw.c13; break; 
     case 14: rId = R.raw.v14; break; 
     case 15: rId = R.raw.v15; break; 
     case 16: rId = R.raw.v16; break; 
     case 17: rId = R.raw.v17; break; 
     case 18: rId = R.raw.v18; break; 
     case 19: rId = R.raw.v19; break; 
     case 20: rId = R.raw.v20; break; 
     case 21: rId = R.raw.v21; break; 
     case 22: rId = R.raw.v22; break; 
     case 23: rId = R.raw.v23; break; 

     default: rId = R.raw.error; break; 
    } 

    soundPlayer = MediaPlayer.create(context, rId); 
    if (soundPlayer != null){ 
     soundPlayer.start(); 
    } 
} 
+0

Collez votre code qui utilise 'MediaPlayer'. Sans cela, il est difficile d'aider. – pkk

+0

Ce n'est pas compliqué ou quoi que ce soit, mais il est coupé. –

+0

Je voudrais tester sur un périphérique réel avant de croire les émulateurs – Blundell

Répondre

3

Eh bien pour commencer, je voudrais essayer de vous assurer que la fonction MediaPlayer.create() est appelée avant la start(). Si c'est un jeu, chargez les sons quand ils commencent un nouveau jeu (en créant un nouveau lecteur multimédia pour chaque son). La raison en est que la fonction create chargera efficacement le fichier son là, puis, prêt pour la lecture en douceur lorsque vous appelez start. Si vous chargez le fichier à chaque fois avant de l'exécuter, non seulement vous faites plus de travail que nécessaire, mais cela peut avoir des effets indésirables sur l'émulateur. Je ne suis pas sûr si vous avez remarqué, mais l'émulateur n'est pas l'outil le plus rapide sur le hangar par rapport à pratiquement n'importe quel appareil physique réel. En conséquence, ce que je pense peut être que l'émulateur «joue» le son et pense qu'il est complet avant que le son ne soit joué, principalement en raison de la vitesse lente de l'émulateur. Essayez-le sur un appareil réel et je pense que vous n'aurez aucun problème.

+0

Merci, je pense que cela aidera. Recommandez-vous un SoundPool sur un tableau d'objets MediaPlayer? –

+2

Cela dépend. Techniquement parlant, aucun n'est meilleur que l'autre. De manière générale, MediaPlayer est utilisé pour des sons plus longs (pensez à la musique de fond) et SoundPool est utilisé pour les effets sonores (clics, tir de pistolets, etc.). Il y a aussi des limitations techniques pour chaque type.MediaPlayer permet de voir si un son est en cours de lecture, contrairement à SoundPool. Cependant, SoundPool facilite la définition d'un maximum de sons et permet de lire le même son (chargé une fois) plusieurs fois simultanément, ce que MediaPlayer ne peut faire que si vous faites beaucoup de MediaPlayers du même son. – Dororo

+0

J'ai récemment couru contre le même problème mais sur un vrai appareil. https://stackoverflow.com/questions/48667840/mediaplayer-finishes-playback-earlier-than-it-should Cependant, le problème n'est reproduit que par une vitesse accrue. – ka3ak

1

Je pense que vous devez faire une version avant de commencer ... par exemple

if(mPlayer!= null) mPlayer.release(); 

    mPlayer = MediaPlayer.create(this, listaMP3[contador]); 
    mPlayer.start();    
+0

Merci-- J'ai fait la sortie en haut de la méthode. Cela cause quand même la coupure. –

1

pour des raisons soem si je définis le MediaPlayer en dehors de la méthode que j'utiliser pour jouer une chanson, cela fonctionne.

Même si j'appelle une seule fois la méthode playSong();

mediaPlayer = MediaPlayer.create(mContext, R.raw.overworld); 
     mediaPlayer.setVolume(musicVolume, musicVolume); 

    playSong(); 

regarderSong Méthode:

private void playSong() { 

    if (!mediaPlayer.isPlaying()) 
       mediaPlayer.start(); // no need to call prepare(); create() does that for you 
} 
+0

J'ai le même comportement. Ma conjecture est que puisque start() ne bloque pas, la méthode se termine et la référence de MediaPlayer est détruite et peut-être que l'objet est récupéré par le GC. Quelqu'un peut-il commenter sur ma conjecture? – Ginandi

5

cette question vient de découvrir après avoir le même problème. La réponse simple dans mon cas était de faire MediaPlayer une variable de classe. Si vous le rendez local à votre méthode, le ramasse-miettes l'emporte et tue le son.

Questions connexes