Android 5.0+ MediaPlayer 在尝试播放 OPUS 文件时抛出 PreparedFailed 异常

Posted

技术标签:

【中文标题】Android 5.0+ MediaPlayer 在尝试播放 OPUS 文件时抛出 PreparedFailed 异常【英文标题】:Android 5.0+ MediaPlayer throws PreparedFailed Exception while trying to play OPUS file 【发布时间】:2016-06-04 16:57:51 【问题描述】:

我正在尝试从我的 android 应用(针对 5.0+)播放 .opus 媒体文件。此文件的来源是设备外部存储。

MediaPlayer 不断抛出 "java.io.IOException: Prepare failed.: status=0x1" 。 请注意,我可以播放其他文件类型,如 mp3 和 aac

注意:已授予 READ_EXTERNAL_STORAGE 权限。

提前谢谢你。

下面是我位于 Android Fragment 中的部分代码:

    public void playVoiceNote(VoiceNoteBO voiceNoteBO)
    try

        Uri myUri = Uri.fromFile(new File(voiceNoteBO.getFileName()));  //this resolves to the full path of the file.

        MediaPlayer mediaPlayer = new MediaPlayer();
        mediaPlayer.setAudiostreamType(AudioManager.STREAM_MUSIC);
        mediaPlayer.setDataSource(getActivity().getApplicationContext(), myUri);
        mediaPlayer.prepare();
        mediaPlayer.start();

    catch(Exception e)
        //TODO
        e.printStackTrace();

    

还有堆栈跟踪:

06-04 18:31:46.129 1134-27920/? E/GenericSource: 从数据源初始化失败! 06-04 18:31:46.129 27425-27443/? E/MediaPlayer: 错误 (1, -2147483648) 06-04 18:31:46.129 27425-27425/? W/System.err: java.io.IOException: Prepare failed.: status=0x1 06-04 18:31:46.130 27425-27425/? W/System.err:在 android.media.MediaPlayer._prepare(本机方法) 06-04 18:31:46.130 27425-27425/? W/System.err:在 android.media.MediaPlayer.prepare(MediaPlayer.java:1135) 06-04 18:31:46.130 27425-27425/? W/System.err:在 com.frankyapps.privateread.prws.fragments.VoiceNotesFragment.playVoiceNote(VoiceNotesFragment.java:166) 06-04 18:31:46.130 27425-27425/? W/System.err:在 com.frankyapps.privateread.prws.fragments.VoiceNotesFragment$1.onClick(VoiceNotesFragment.java:76) 06-04 18:31:46.130 27425-27425/? W/System.err:在 com.frankyapps.privateread.prws.fragments.VoiceNotesFragment$RecyclerTouchListener.onInterceptTouchEvent(VoiceNotesFragment.java:217) 06-04 18:31:46.130 27425-27425/? W/System.err:在 android.support.v7.widget.RecyclerView.dispatchOnItemTouch(RecyclerView.java:2261) 06-04 18:31:46.130 27425-27425/? W/System.err:在 android.support.v7.widget.RecyclerView.onTouchEvent(RecyclerView.java:2389) 06-04 18:31:46.130 27425-27425/? W/System.err:在 android.view.View.dispatchTouchEvent(View.java:8471)

【问题讨论】:

这个问题你解决了吗?你能分享代码吗? 【参考方案1】:

尝试使用 create() 方法创建 MediaPlayer 对象。 你可以这样做:

MediaPlayer mediaPlayer = MediaPlayer.create(context, myUri);
mediaPlayer.start();

无需调用 prepare() 方法(如果您使用 create() 实例化 MediaPlayer 对象),因为 prepare() 将被 create() 隐式调用。

此链接肯定会对您有所帮助:https://developer.android.com/reference/android/media/MediaPlayer.html

【讨论】:

谢谢,但它仍然失败,同样的异常,已经试过了。另请注意,我之前的代码可以正确播放 aac 和 mp3 文件! 嗨 Elio,您正在为哪个版本的 android 编写代码?您在哪个版本中运行您的应用程序? 嗨,Sneh,目标是 5.0,在 6.0 上运行

以上是关于Android 5.0+ MediaPlayer 在尝试播放 OPUS 文件时抛出 PreparedFailed 异常的主要内容,如果未能解决你的问题,请参考以下文章

Android 音频开发之 MediaPlayer

Android:MediaPlayer.setDataSource(FileDescriptor fd) vs MediaPlayer.setDataSource(FileDescriptor fd,

android的MediaPlayer.create方法怎么用

Android开发---MediaPlayer简单音乐播放器

Android MediaPlayer错误码整理

Android:MediaPlayer 未发布就完成了