web-dev-qa-db-fra.com

Erreur Mediaplayer (-19,0) après des lectures répétées

J'ai un jeu dans lequel un son est joué lorsqu'un niveau est terminé. Tout fonctionne bien pour commencer, mais après avoir répété un niveau 10 ou 20 fois, le logcat signale soudain: "Erreur MediaPlayer (-19,0)" et/ou "MediaPlayer start appelé dans l'état 0" et les sons ne sont plus émis.

À l'origine, j'avais tous les sons au format mp3 mais, après avoir lu que l'ogg peut être plus fiable, je les ai tous convertis en ogg, mais les erreurs sont apparues tout de même.

Une idée comment je peux résoudre ce problème?

43
Mick

J'obtenais le même problème, je l'ai résolu en ajoutant le code suivant pour libérer le lecteur:

mp1 = MediaPlayer.create(sound.this, R.raw.pan1);
mp1.start();
mp1.setOnCompletionListener(new OnCompletionListener() {
    public void onCompletion(MediaPlayer mp) {
        mp.release();

    };
});
69
Gabriel Kaffka

Je pense que vous ne libérez pas les lecteurs multimédias que vous utilisez pour jouer le son .. Vous devez libérer () les lecteurs multimédias sinon les ressources ne sont pas libérées, et vous sortez rapidement de la mémoire (puisque vous répartissez-les à nouveau la prochaine fois). donc je pense que vous pouvez jouer deux fois, voire trois fois ... mais pas plusieurs fois sans libérer les ressources

61
5hssba

MediaPlayer n'est pas une bonne option lorsque vous jouez de petits effets sonores car l'utilisateur peut cliquer sur plusieurs boutons très bientôt et vous devrez créer un MP objet pour chacun d'eux qui ne se produit pas de manière synchrone. C'est pourquoi vous n'entendez pas de sons à chaque clic. Optez pour la classe SoundPool qui vous permet de garder des sons plus petits chargés en mémoire et vous pouvez les lire à tout moment sans aucun décalage que vous ressentiriez dans un lecteur multimédia. http://developer.Android.com/reference/Android/media/SoundPool.html Voici un joli tutoriel: http://www.anddev.org/using_soundpool_instead_of_mediaplayer-t3115. html

15
Akhil

J'ai résolu à la fois les erreurs (-19,0) et (-38,0), en créant un nouvel objet de MediaPlayer à chaque fois avant de jouer et en le libérant après cela.

Avant :

void play(int resourceID) {
    if (getActivity() != null) {

         //Using the same object - Problem persists
        player = MediaPlayer.create(getActivity(), resourceID);
        player.setAudioStreamType(AudioManager.STREAM_MUSIC);

        player.setOnCompletionListener(new MediaPlayer.OnCompletionListener() {
            @Override
            public void onCompletion(MediaPlayer mp) {
                player.release();
            }
        });

        player.setOnPreparedListener(new MediaPlayer.OnPreparedListener() {
            @Override
            public void onPrepared(MediaPlayer mp) {
                mp.start();
            }
        });

    }
}

Après:

 void play(int resourceID) {

    if (getActivity() != null) {

        //Problem Solved
        //Creating new MediaPlayer object every time and releasing it after completion
        final MediaPlayer player = MediaPlayer.create(getActivity(), resourceID);
        player.setAudioStreamType(AudioManager.STREAM_MUSIC);

        player.setOnCompletionListener(new MediaPlayer.OnCompletionListener() {
            @Override
            public void onCompletion(MediaPlayer mp) {
                player.release();
            }
        });

        player.setOnPreparedListener(new MediaPlayer.OnPreparedListener() {
            @Override
            public void onPrepared(MediaPlayer mp) {
                mp.start();
            }
        });

    }
}
2
Saurabh Padwekar

C'est une très vieille question, mais elle est apparue en premier dans mes résultats de recherche. Donc, d'autres personnes ayant le même problème finiront probablement par arriver sur cette page.

Contrairement à ce que certains ont dit, vous pouvez en fait utiliser MediaPlayer pour de petits sons sans utiliser beaucoup de mémoire. Je vais mettre un petit extrait modifié de mon application de table d'harmonie pour vous montrer où je veux en venir.

private MediaPlayer mp;

protected void onCreate(Bundle savedInstanceState) {
    super.onCreate(savedInstanceState);
    setContentView(R.layout.your_layout);

    mp = new MediaPlayer();

}

private void playSound(int soundID){
     mp.reset();
     AssetFileDescriptor sound = getResources().openRawResourceFd(soundID);
     try {
         mp.setDataSource(sound.getFileDescriptor(),sound.getStartOffset(),sound.getLength());
         mp.prepare();
     } catch (IOException e) {
         e.printStackTrace();
     }
     mp.start();


}

avec la façon dont je l'ai configuré, vous créez sur un objet MediaPlayer que vous réutilisez à chaque fois que vous jouez un son afin de ne pas utiliser trop d'espace.

Vous appelez .reset () au lieu de .release () car .release () n'est utilisé que si vous supprimez un objet, mais vous souhaitez conserver votre objet MediaPlayer.

Vous utilisez un assetfiledescriptor pour définir un nouveau fichier son pour votre lecteur multimédia au lieu de définir un nouvel objet à votre adresse de lecteur multimédia, car de cette façon, vous créez de nouveaux objets dans la méthode qui ne sont pas gérés correctement et vous finirez par rencontrer le même erreur comme vous l'avez décrit.

Ce n'est qu'une des nombreuses façons d'utiliser MediaPlayer, mais je pense personnellement qu'il est le plus efficace si vous ne l'utilisez que pour de petites applications sonores. Le seul problème avec cela est qu'il est relativement restrictif dans ce que vous pouvez accomplir, mais cela ne devrait pas être un problème si vous l'utilisez effectivement pour de petites applications sonores.

1
CarbonZonda

j'essaie de supprimer l'émulateur et de créer un nouvel émulateur pour supprimer l'erreur du lecteur multimédia (-19,0).

1
AnilPatel