2012-03-27 10 views
39

Tengo un juego en el que se reproduce un sonido cuando se completa un nivel. Todo funciona bien para comenzar, pero después de repetir un nivel de 10 o 20 veces, el logcat informa de repente: "Error MediaPlayer (-19,0)" y/o "MediaPlayer start llamado en estado 0" y los sonidos ya no se hacen.Error de mediaplayer (-19,0) después de repetidas reproducciones

Originalmente tenía todos los sonidos en formato mp3 pero, después de leer que ogg puede ser más confiable, los convertí todos a ogg, pero los errores aparecieron de todos modos.

¿Alguna idea de cómo puedo solucionar este problema?

Respuesta

55

creo que usted es no liberar los reproductores de medios que está utilizando para reproducir el sonido .. Es necesario liberar() los reproductores multimedia de otro modo los recursos no son liberados, y pronto a salir de la memoria (ya que asignarlos nuevamente la próxima vez). Por lo tanto, creo que se puede jugar dos veces o incluso tres veces ... pero no muchas veces sin la liberación de los recursos

13

MediaPlayer es no es una buena opción cuando se está jugando pequeños efectos de sonido como el usuario puede hacer clic en los botones múltiples muy pronto y tendrá que crear un objeto MP para todos ellos, lo que no ocurre de forma sincrónica. Es por eso que no escuchas sonidos por cada clic. Vaya a la clase SoundPool que le permite mantener pequeños sonidos cargados en la memoria y puede reproducirlos en cualquier momento que desee sin ningún retraso que pueda sentir en un reproductor de medios. http://developer.android.com/reference/android/media/SoundPool.html Aquí hay un buen tutorial: http://www.anddev.org/using_soundpool_instead_of_mediaplayer-t3115.html

1

trato de eliminar emulador y crear nuevo emulador para eliminar el error de (-19,0) reproductor multimedia.

58

que estaba recibiendo el mismo problema, lo solucioné añadiendo el siguiente código para liberar al jugador:

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

    }; 
}); 
+3

Funciona perfectamente para la liberación automática del reproductor cuando termina, muchas gracias – Pelanes

+0

funciona como el encanto. –

1

Solucioné tanto los errores (-19,0) y (-38,0), creando un nuevo objeto de MediaPlayer cada vez antes de jugar y soltándolo después de eso.

Antes:

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(); 
      } 
     }); 

    } 
} 

Despué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(); 
      } 
     }); 

    } 
} 
1

Ésta es una pregunta muy antigua, pero esto ocurrió por primera vez en mis resultados de búsqueda para que otras personas con el mismo problema, probablemente vendrá sobre esta página eventualmente

A diferencia de lo que otros han dicho, de hecho, puede utilizar MediaPlayer para pequeños sonidos sin utilizar mucha memoria. Pondré un pequeño snippit modificado de mi aplicación de la caja de resonancia para mostrarte a qué me refiero.

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(); 


} 

con la forma en lo configuro, se crea el objeto MediaPlayer que vuelve a utilizar cada vez que se reproduce un sonido para que no se utiliza demasiado espacio.

Llamar a .reset() en lugar de .release() porque .release() solo se utiliza si se está deshaciendo de un objeto, sin embargo, desea mantener su objeto MediaPlayer.

Utiliza un assetfiledescriptor para establecer un nuevo archivo de sonido para que reproduzca tu reproductor en lugar de establecer un nuevo objeto en la dirección del reproductor multimedia porque de ese modo estás creando objetos nuevos dentro del método que no se manejan correctamente y finalmente se encuentra con el mismo error que describió.

Esta es solo una de las muchas maneras de usar MediaPlayer, pero personalmente creo que es la más eficiente si solo la usa para aplicaciones de sonido pequeño. El único problema es que es relativamente restrictivo en lo que puedes lograr, pero eso no debería ser un gran problema si realmente lo estás usando para pequeñas aplicaciones de sonido.

Cuestiones relacionadas