Mediaplayer错误(-19,0)重复播放后
我有一个游戏,当一个级别完成时,一个声音播放。 一切工作正常开始,但重复一个级别10或20次后,logcat突然报告:“MediaPlayer错误(-19,0)”和/或“MediaPlayer开始在状态0调用”,并不再发出声音。
我原来是用mp3格式的所有声音,但是在读完ogg后可能会更加可靠,我把它们全部转换成了ogg,但是错误也是一样的。
任何想法如何解决这个问题?
我认为你不会释放你用来播放声音的媒体播放器。你需要释放()媒体播放器,否则资源不会释放,你很快就会失去内存(因为你下次再分配它们)。 所以,我觉得你可以玩两次甚至三次…但是没有释放资源的次数也不会太多
我遇到了同样的问题,我通过添加下面的代码释放播放器来解决它:
mp1 = MediaPlayer.create(sound.this, R.raw.pan1); mp1.start(); mp1.setOnCompletionListener(new OnCompletionListener() { public void onCompletion(MediaPlayer mp) { mp.release(); }; });
当您播放小音效时,MediaPlayer 不是一个好的select ,因为用户可以很快点击多个button,您将不得不为所有这些button同步创build一个MP对象。 这就是为什么你没有听到每一次点击的声音。 去SoundPool类,它允许你保持更小的声音加载到内存中,你可以随时播放它们,而不会在mediaplayer中感觉到任何延迟。 http://developer.android.com/reference/android/media/SoundPool.html这是一个很好的教程:; http : //www.anddev.org/using_soundpool_instead_of_mediaplayer-t3115.html
我尝试删除模拟器和新的创build模拟器(-19,0)媒体播放器的错误。
我解决了这两个错误(-19,0)和(-38,0),通过每次创buildMediaPlayer的一个新的对象之前播放和释放它。
之前:
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(); } }); } }
后:
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(); } }); } }
这是一个非常古老的问题,但是这在search结果中首先出现,所以其他有相同问题的人最终可能会出现在这个页面上。
与其他人所说的不同,事实上,您可以使用MediaPlayer进行小声音处理,而无需使用大量内存。 我会从我的音板应用程序中join一点修改过的snippit,以向你展示我所得到的结果。
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(); }
按照我设置的方式,您可以在MediaPlayer对象上创build,每次播放声音时都可以重复使用,以免占用太多空间。
您调用.reset()而不是.release(),因为.release()仅用于处理对象,但是要保留MediaPlayer对象。
您可以使用assetfiledescriptor为mediaplayer设置一个新的声音文件,而不是为mediaplayer地址设置一个新的对象,因为这样您在方法中创build的新对象的处理方式不正确,您最终会遇到同样的问题错误,如你所述。
这只是使用MediaPlayer的许多方法之一,但我个人认为这是最有效的,如果你只用于小型声音应用程序。 唯一的问题是,它可以完成什么是相对的限制性的,但如果你真的把它用于小型声音应用程序,这应该不是什么大问题。