重复播放后 Mediaplayer 错误 (-19,0)
Posted
技术标签:
【中文标题】重复播放后 Mediaplayer 错误 (-19,0)【英文标题】:Mediaplayer error (-19,0) after repeated plays 【发布时间】:2012-04-10 22:10:09 【问题描述】:我有一个游戏,当一个关卡完成时会播放声音。一开始一切正常,但在重复 10 或 20 次级别后,logcat 突然报告: “MediaPlayer 错误 (-19,0)”和/或“MediaPlayer 在状态 0 中开始调用”并且不再发出声音。
我原本拥有的所有声音都是 mp3 格式的,但是在阅读了 ogg 可能更可靠之后,我将它们全部转换为 ogg,但出现的错误还是一样的。
知道如何解决这个问题吗?
【问题讨论】:
【参考方案1】:我遇到了同样的问题,我通过添加以下代码来释放播放器来解决它:
mp1 = MediaPlayer.create(sound.this, R.raw.pan1);
mp1.start();
mp1.setOnCompletionListener(new OnCompletionListener()
public void onCompletion(MediaPlayer mp)
mp.release();
;
);
【讨论】:
非常适合在播放完成后自动释放播放器,非常感谢【参考方案2】:我认为您没有发布用于播放声音的媒体播放器.. 您需要 release() 媒体播放器,否则资源不会被释放,并且您很快就会耗尽内存(因为您下次再次分配它们)。所以,我认为你可以玩两次甚至三次......但不释放资源就不能玩很多次
【讨论】:
【参考方案3】:MediaPlayer 不是一个好的选择当您播放小音效时,因为用户可以很快点击多个按钮,您将不得不为所有这些按钮创建一个 MP 对象,这不会同步发生.这就是为什么每次点击都听不到声音的原因。选择 SoundPool 类,它允许您将较小的声音加载到内存中,并且您可以随时播放它们,而不会像在媒体播放器中那样有任何延迟。 http://developer.android.com/reference/android/media/SoundPool.html这是一个不错的教程:http://www.anddev.org/using_soundpool_instead_of_mediaplayer-t3115.html
【讨论】:
【参考方案4】:我解决了两个错误 (-19,0) 和 (-38,0) ,方法是每次在播放之前创建一个新的 MediaPlayer 对象并在之后释放它。
之前:
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();
);
【讨论】:
【参考方案5】:这是一个非常古老的问题,但它首先出现在我的搜索结果中,所以其他有相同问题的人最终可能会出现在这个页面上。
与其他人所说的不同,实际上您可以将 MediaPlayer 用于小声音,而无需使用大量内存。我将从我的音板应用中添加一些经过修改的片段,以向您展示我的意思。
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 对象上创建,这样就不会占用太多空间。
您调用 .reset() 而不是 .release() 因为 .release() 仅在您处理对象时使用,但是您想保留 MediaPlayer 对象。
您使用assetfiledescriptor 为您的媒体播放器设置一个新的声音文件来播放,而不是为您的媒体播放器地址设置一个新对象,因为这样您在方法中创建了未正确处理的新对象,您最终将运行进入与您描述的相同的错误。
这只是使用 MediaPlayer 的众多方法之一,但我个人认为,如果您只将它用于小型声音应用程序,它是最有效的。唯一的问题是它在你可以完成的事情上相对有限,但如果你确实将它用于小型声音应用程序,那应该不是什么大问题。
【讨论】:
【参考方案6】:我尝试删除模拟器和新创建模拟器以消除 (-19,0) 媒体播放器的错误。
【讨论】:
以上是关于重复播放后 Mediaplayer 错误 (-19,0)的主要内容,如果未能解决你的问题,请参考以下文章
当 MediaPlayer 完成播放第一个音频时,MediaPlayer 更改数据源错误
与 MediaPlayer 一起使用后如何清除 SurfaceTexture?