为啥我的mediaplayer11好几种文件都播不了

Posted

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了为啥我的mediaplayer11好几种文件都播不了相关的知识,希望对你有一定的参考价值。

播放器是最新版本了,RM文件播放不了,我不想下载解码器,那位有插件给我传一个,而且无法连接到web版迅雷上播放,如果下载到插件之后应放在那个目录下面才有用.高手帮忙想想办法,谢谢

media11是可以播放DVD的,但是RM的格式不太支持,你可以下载个解码器来配合使用,如果不想还是换软件吧!下载个暴风影音之类的播放软件来用,基本上什么格式都支持。 参考技术A 我从来不用mediaplayer11因为不能播dvd
我用暴风影音
以前用过“超级解霸3000”绝对不卡,划的盘也不卡,但开始运行比较慢
你可以考虑下

为啥 MediaPlayer.start 不从零开始播放?

【中文标题】为啥 MediaPlayer.start 不从零开始播放?【英文标题】:Why doesn't MediaPlayer.start start the playback at zero?为什么 MediaPlayer.start 不从零开始播放? 【发布时间】:2014-12-01 00:05:48 【问题描述】:

这是我的源代码

private MediaPlayer mP;

@Override
protected void onCreate(Bundle savedInstanceState) 

    super.onCreate(savedInstanceState);
    setContentView(R.layout.activity_main);
    mP = MediaPlayer.create(getApplicationContext(),R.raw.nintendo);


@Override
protected void onResume() 

    super.onResume();
    try 

        mP.prepareAsync();
     catch (IllegalStateException e) 

        e.printStackTrace();
    
    mP.setOnPreparedListener(new OnPreparedListener() 

        @Override
        public void onPrepared(MediaPlayer mp) 

            mP.seekTo(0);
            mP.start();
        
    );


@Override
protected void onPause() 

    super.onPause();
    mP.stop();
    mP.release();

这是我在尝试运行 Logcat 时得到的结果

第 64 行:mP.stop();

当我执行以下序列时,会出现此 Logcat 输出, 启动 -> 主屏幕->返回应用程序 -> 主屏幕

现在我知道当您尝试进行无效的状态更改时会发生 IllegalStateException。从http://developer.android.com/reference/android/media/MediaPlayer.html,我知道有效的状态变化是从“开始到停止”或“停止到停止”。我认为我的代码中的逻辑代表了一个有效的状态变化(从 onPause 开始到 onPause 停止/释放)。 我进一步调试并意识到在我转到主屏幕并返回应用程序后,onPrepared 没有被调用......我也不明白这一点,因为我事先调用了 mP.prepareAsync() (异步以避免事先阻塞这个主 ui 线程)。 onPrepared 不应该在所有声音资源都收集完之后触发吗?

我查看了其他一些线程 不可能是这个Android Media Player,因为我很好地构建了 MediaPlayer。 再次在这里android MediaPlayer not playing mp3 file 没有解决我的问题,因为我构建了 MediaPlayer 并且它在我第一次启动应用程序时播放了声音。

有人发现这段代码有问题吗?

【问题讨论】:

【参考方案1】:

首先,不要在您使用MediaPlayer.create() 创建的MediaPlayer 上调用prepareAsync(),因为prepare() 会为您处理好。

来自文档:

http://developer.android.com/reference/android/media/MediaPlayer.html

MediaPlayer.onCreate()...

为给定资源 ID 创建 MediaPlayer 的便捷方法。在 成功,prepare() 已经被调用并且不能被调用 再次调用。

由于您在onPause() 中发布您的MediaPlayer,如果您想在onResume() 中再次播放,您将不得不使用MediaPlayer.onCreate() 创建一个新的MediaPlayer

我建议你干脆不要在onPause() 中释放MediaPlayer,调用mP.pause() 而不是mP.stop(),然后你不必担心重新创建/准备onResume() 中的MediaPlayer .

这是一个例子:

private MediaPlayer mMediaPlayer;
private boolean mIsPrepared;

@Override
protected void onCreate(Bundle savedInstanceState) 
    super.onCreate(savedInstanceState);
    setContentView(R.layout.activity_main);

    mMediaPlayer = MediaPlayer.create(this, R.raw.raw1);
    mMediaPlayer.setOnPreparedListener(new MediaPlayer.OnPreparedListener() 
        @Override
        public void onPrepared(MediaPlayer mp) 
            mIsPrepared = true;
        
    );


@Override
protected void onResume() 
    super.onResume();

    if (mMediaPlayer != null && mIsPrepared) 
        mMediaPlayer.seekTo(0);
        mMediaPlayer.start();
    


@Override
protected void onPause() 
    super.onPause();

    if(mMediaPlayer!=null && mIsPrepared)
        mMediaPlayer.pause();
    

【讨论】:

所以一旦你释放(释放与MediaPlayer关联的资源),你就不能准备让它再次播放? 我选择在 inPause 中释放是因为 docs "r 中的这一行。特别是,每当应用程序的 Activity 暂停(调用其 onPause() 方法)或停止(其 onStop () 方法),则应调用此方法以释放 MediaPlayer 对象,除非应用程序有特殊需要保留该对象。”哦,所以我确实特别需要保留它 - 再玩一次 如果您使用的是 MediaPlayer.create(context, rawRes) 那么不 - 您不能“再次准备”AFAIK。如果您通过其他方式创建了 MediaPlayer,则可以调用 prepare().. 您必须创建媒体播放器,将数据源(指向原始资源的资产文件描述符)传递给它,然后准备它。然后,如果您稍后停止并释放它,您可以将它传递给一个新的数据源并再次准备它。但无论如何,你实际上只是在重新创建它。 我不知道您所做的是否属于保留 MediaPlayer 对象的“特殊需要”。如果您希望在活动暂停时停止播放,那么我不明白为什么您不能释放 MediaPlayer 并稍后重新创建它。处理这一切的最简单方法可能是将您的 create() 代码放入 onResume 而不是 onCreate - 每次调用 onResume 时创建并播放一个新的 MediaPlayer - 并在 onPause() 中销毁它。 对我来说,每次重新创建只会在堆上浪费太多内存

以上是关于为啥我的mediaplayer11好几种文件都播不了的主要内容,如果未能解决你的问题,请参考以下文章

为啥这个基于 UIScrollView 的轮播不响应水平滑动?

IE11中的猫头鹰轮播不起作用

Bootstrap 3轮播不工作

为啥 MediaPlayer.start 不从零开始播放?

在单个页面上使用两个(猫头鹰)轮播不起作用

MediaPlayer是啥意思