Android MediaPlayer在2.1上投掷"准备失败:状态= 0x1",适用于2.2

Nik*_*man 33 android media-player

我一直在试图让MediaPlayer类尝试在Android 2.1上播放h.264编码的视频.我的代码很简单:

  AssetFileDescriptor fileDescriptor = getResources().openRawResourceFd(R.raw.my_movie);
  introMoviePlayer = new MediaPlayer();
  introMoviePlayer.setDataSource(fileDescriptor.getFileDescriptor(), fileDescriptor.getStartOffset(), fileDescriptor.getDeclaredLength());
  introMoviePlayer.prepare();
Run Code Online (Sandbox Code Playgroud)

这总是会prepare()在文本中引发异常java.io.IOException: Prepare failed.: status=0x1.我通过使用MediaPlayer.create()一个URI 获得了更多的信息,这个URI也会抛出prepare(),实际上是由MediaPlayer.create()消息引起的Command PLAYER_PREPARE completed with an error or info PVMFErrResourceConfiguration.

相同的代码在Froyo(2.2)中完美运行.视频本身在视频播放器应用中播放得很好.有没有人可能有一个有用的提示可能有助于解决这个问题?

编辑:仍然没有解决方案 - 非常令人沮丧的问题.但是,我发现通过创建VideoView和设置原始视频的URI工作.这非常令人费解,因为通过MediaPlayer类发送完全相同的URI将会抛出.

小智 29

这是我的解决方案:

MediaPlayer mediaPlayer = new MediaPlayer();
FileInputStream fis = null;
try {
    File directory = new File("android.resource://com.example.myapp/raw/");
    fis = new FileInputStream(directory);
    mediaPlayer.setDataSource(fis.getFD());
    mediaPlayer.setAudioStreamType(AudioManager.STREAM_MUSIC);
    mediaPlayer.prepare();
}   finally {
    if (fis != null) {
        try {
            fis.close();
        } catch (IOException ignore) {
        }
    }

}
Run Code Online (Sandbox Code Playgroud)

  • 谢谢,这段代码"fis.getFD()"节省了我的一天 (4认同)
  • 只是提醒本地文件.如果MediaPlayer.setDataSource(String path)有准备错误,那么这种解决方法也不起作用.由于在MediaPlayer.setDataSource(String path)的后台逻辑中,它也使用setDataSource(FileDescriptor fd). (2认同)

Rya*_*ner 18

我不知道这是不是你的问题,但我刚刚找到了Tuszy所描述的问题的解决方案.我可以从外部存储中读取我正在创建的文件,但不能从Cache中读取.

解决方案是写入文件时的读写权限不同.

请在我发现的这个博客中看到这个优秀的解释.

http://blog.weston-fl.com/android-mediaplayer-prepare-throws-status0x1-error1-2147483648/

在此输入图像描述

在此输入图像描述


Ant*_*Roe 7

我知道我迟到了,但希望这有助于其他人.我通过设置一个setOnCompletionListener在媒体播放后显式释放MediaPlayer对象的回调来解决这个问题.

我不能赞成这个解决方案,因为它最初是由Ronny发布的: 你如何检测声音文件何时完成?

但是,因为这是我搜索Android +失败状态0x1的第一个答案,这里是我的代码,为我解决了这个问题:

 public void playSound(String soundPath){
    MediaPlayer m = new MediaPlayer();

    m.setOnCompletionListener(new OnCompletionListener() {

        @Override
        public void onCompletion(MediaPlayer mp) {
            mp.release();
        }

    });

    try {

        AssetFileDescriptor descriptor = mContext.getAssets().openFd(soundPath);
        m.setDataSource(descriptor.getFileDescriptor(), descriptor.getStartOffset(),
                        descriptor.getLength());            

        descriptor.close();

        m.prepare();
        m.setVolume(100f, 100f);
        m.setLooping(false);
        m.start();

    } catch (Exception e) {
        //Your catch code here.
    }
 }   
Run Code Online (Sandbox Code Playgroud)


Vas*_*tov 7

如果其他人在从远程 URL 读取时遇到困难,

我的网址都是不安全的(即 http 而不是 https)

因为我无法访问服务器网址(第 3 方)

我必须在 android 清单中添加以下内容。

<application
    ...
    android:usesCleartextTraffic="true"
    ...
</application>
Run Code Online (Sandbox Code Playgroud)


Pau*_*sma 5

如果您使用的是多个实例MediaPlayer,请确保release()在尝试在其他实例中使用它之前已对资源执行了该操作.