mecool - mediaplayer create android example
Error Mediaplayer(-19,0) después de repetidas jugadas (6)
Creo que no está liberando los reproductores multimedia que está utilizando para reproducir el sonido . Debe liberar () los reproductores multimedia; de lo contrario, los recursos no se liberarán y pronto se quedará sin memoria (ya que los asigna de nuevo la próxima vez). Entonces, creo que puedes jugar dos o tres veces ... pero no muchas veces sin liberar los recursos
Tengo un juego en el que se reproduce un sonido cuando se completa un nivel. Para empezar, todo funciona bien, pero después de repetir un nivel 10 o 20 veces, el logcat informa de forma repentina: "Error de MediaPlayer (-19,0)" y / o "Se inicia el inicio de MediaPlayer en estado 0" y ya no se producen los sonidos.
Originalmente tenía todos los sonidos en formato mp3 pero, después de leer que ogg puede ser más confiable, los convertí a ogg, pero los errores aparecieron igual.
¿Alguna idea de cómo puedo solucionar este problema?
Esta es una pregunta muy antigua, pero surgió primero en mis resultados de búsqueda, por lo que otras personas con el mismo problema probablemente llegarán a esta página con el tiempo.
A diferencia de lo que otros han dicho, de hecho puedes usar MediaPlayer para pequeños sonidos sin usar mucha memoria. Pondré un pequeño fragmento modificado de mi aplicación de 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 que lo configuro, creas en el objeto MediaPlayer que reutilizas cada vez que escuchas un sonido para que no ocupes demasiado espacio.
Llama a .reset () en lugar de .release () porque .release () solo se usa si está desechando un objeto, sin embargo, desea conservar su objeto MediaPlayer.
Usted usa un descriptor de archivos de recursos para establecer un nuevo archivo de sonido para que su reproductor de medios lo reproduzca en lugar de configurar un nuevo objeto en su dirección de reproductor de medios, ya que de esa manera está creando nuevos objetos dentro del método que no se manejan adecuadamente y finalmente se encontrará con el mismo. error como lo describiste.
Esta es solo una de las muchas formas de usar MediaPlayer, pero personalmente creo que es la más eficiente si solo la usas para aplicaciones de sonido pequeño. El único problema con esto es que es relativamente restrictivo en lo que puedes lograr, pero eso no debería ser un problema si lo estás utilizando para aplicaciones de sonido pequeño.
Estaba teniendo el mismo problema, lo resolví agregando el siguiente código para liberar el reproductor:
mp1 = MediaPlayer.create(sound.this, R.raw.pan1);
mp1.start();
mp1.setOnCompletionListener(new OnCompletionListener() {
public void onCompletion(MediaPlayer mp) {
mp.release();
};
});
Intento eliminar el emulador y crear un nuevo emulador para eliminar el error de (-19,0) reproductor de medios.
MediaPlayer no es una buena opción cuando está reproduciendo pequeños efectos de sonido, ya que el usuario puede hacer clic en varios botones 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 estás escuchando sonidos por cada clic. Vaya a la clase SoundPool, que le permite mantener cargados los sonidos más pequeños en la memoria y puede reproducirlos en cualquier momento que desee sin ningún retraso que sentiría en un reproductor multimedia. 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
Resolví 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 de :
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();
}
});
}
}