繁体   English   中英

Media Player创建失败时如何恢复?

[英]Media Player how to recover when create fails?

我有一个应用程序,它每秒随机播放20种不同声音中的1种。 在成功运行近1000次之后,媒体播放器创建函数开始始终返回null。 即使我离开应用程序并再次启动它,问题仍然存在。 唯一的解决方案是当我再次安装该应用程序或关闭电源后再打开设备。

有什么方法可以从这种状态中恢复吗? 如果我确实释放或重置,则媒体播放器已经为空,并且它们会产生异常。

我每秒执行的序列如下:

if (mp != null)
{   
    if (mp.isPlaying()) 
    {
       mp.stop();   
    }   
    if (mp != null) mp.release();   
    if (mp != null) mp = null;  
}   

mp = MediaPlayer.create(this, R.raw.sound);

if (mp !=null)
{
   mp.setOnPreparedListener(new MediaPlayer.OnPreparedListener() 
   {           
      public void onPrepared(MediaPlayer mp) 
      {
    if (mp != null) mp.start();
      }
   };
 }
 else
 {
    // error, what should I do here to recover from this situation?
 }

您的问题是,即使在发布MediaPlayer ,在您再次尝试使用OS时,操作系统可能仍未释放资源,尤其是每秒20次。 实际上,我建议您考虑使用SoundPool代替类似的东西。

无论如何,要使用MediaPlayer做到这一点,您应该只保留一个引用,并每次针对不同的声音重用该对象。 由于您正在使用原始资源进行播放,因此通常的重用场景如下所示:

AssetFileDescriptor afd = getResources().openRawResourceFd(R.raw.sound);

//Resets the MediaPlayer state but keeps the resources
mp.reset();

//Sets the data source to the requested sound (R.raw.sound)
mp.setDataSource(afd.getFileDescriptor());

//Prepare the MediaPlayer to play and then start
mp.prepare();
mp.start();

看来我找到了解决方案。 我现在播放了10000多个音频,而不再重现错误。

我要感谢kcoppock的帮助,我现在不创建和发布,因为更改数据源要比他解释的要好得多,但这不是主要问题。

最终解决方案是将所有mp3文件转换为ogg文件!

Media Player绝对具有mp3文件问题。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM