重复播放后 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 更改数据源错误

与 MediaPlayer 一起使用后如何清除 SurfaceTexture?

音频文件不与 mediaController 一起播放?

获取 E/MediaPlayer:尝试从给定 URL 播放视频时出现错误 (1,-2147483648) 错误

尝试从列表播放时出现 MediaPlayer 错误