代码之家  ›  专栏  ›  技术社区  ›  Nik Reiman

Android MediaPlayer在2.1上抛出“Prepare failed.:status=0x1”,在2.2上工作

  •  29
  • Nik Reiman  · 技术社区  · 16 年前

    为了让MediaPlayer类在android2.1上播放h.264编码的视频,我一直在拼命工作。我的代码很简单:

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

    这总是引发异常 prepare() java.io.IOException: Prepare failed.: status=0x1 . 我通过使用 MediaPlayer.create() 准备() ,实际上由 Command PLAYER_PREPARE completed with an error or info PVMFErrResourceConfiguration .

    同样的代码在Froyo(2.2)中运行得非常好。视频本身在视频播放器应用程序中播放得很好。有没有人可能有一个有用的提示,可能有助于解决这个问题?

    编辑 :仍然没有解决办法——确实是一个非常令人沮丧的问题。但是,我发现 VideoView

    14 回复  |  直到 16 年前
        1
  •  19
  •   Tura Leandro Borges Ferreira    8 年前

    我不知道这是否是你的问题,但我只是找到了一个解决问题的塔西上述描述。我可以从外部存储器读取正在创建的文件,但不能从缓存读取。

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

    请在我找到的这个博客里看到这个极好的解释。

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

    enter image description here

    enter image description here

        2
  •  30
  •   Md Imran Choudhury    7 年前

    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) {
            }
        }
    
    }
    
        3
  •  7
  •   Community Mohan Dere    9 年前

    我知道我来晚了,但希望这能帮助别人。我通过建立一个 setOnCompletionListener 在媒体播放完成后显式释放MediaPlayer对象的回调。

    我不能相信这个解决方案,因为它最初是由Ronny在这里发布的: How do you detect when a sound file has finished?

    但由于这是我搜索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.
        }
     }   
    
        4
  •  4
  •   Paul Lammertsma    14 年前

    如果您使用的是 MediaPlayer ,确保你已经执行了 release() 在尝试在其他实例中使用资源之前。

        5
  •  3
  •   ani0904071    10 年前

    初始化文件名,mediaPlayer实例:

    private MediaPlayer mp;
    private final static String fileName = "ring";
    

            try 
            {   
                mp = new MediaPlayer();
                mp.setAudioStreamType(AudioManager.STREAM_RING); //set streaming according to ur needs
                mp.setDataSource(Context, Uri.parse("android.resource://yourAppPackageName/raw/"+fileName));
                mp.setLooping(true);
                mp.prepare();
                mp.start();
    
            } catch (Exception e) 
            {
                System.out.println("Unable to TunePlay: startRingtone(): "+e.toString());
            }
    

    最后停止音频文件:

        try
        {
            if (!(mp == null) && mp.isPlaying())
            {
                mp.stop();
                mp.release(); //its a very good practice
            }       
        }
        catch (Exception e)
        {
            System.out.println("Unable to  TunePlay: stopRingtone():"+e.toString());
        }
    
        6
  •  2
  •   srgtuszy    14 年前

    我也有类似的问题。我有一个压缩文件,其中包含压缩的声音文件。为了把它们传给 MediaPlayer context.getCacheDir() ), 媒体播放器 返回与您描述的相同的错误。

    但当我把它们放在外置存储器里( Environment.getExternalStorageDirectory() ),一切开始运作。

        7
  •  2
  •   SAWJUSTO    14 年前

        8
  •  2
  •   Md Imran Choudhury    7 年前

    我知道这可能太晚了。我设法使用了以下资源中的视频:

    MediaPlayer mp = ...;
    Uri uri = Uri.parse("android.resource://"+getPackageName()+"/" + R.raw.my_movie);
    mp.setDataSourceUri(this, uri);
    
        9
  •  1
  •   Jason Rogers    15 年前

    很抱歉,我没有一个明确的答案,你的问题,但根据api媒体的例子在SDK和我的媒体播放器在我的项目中,我建议检查文件是否打开正确。

    mMediaPlayer = new MediaPlayer();
                mMediaPlayer.setDataSource(fileDescriptor.getFileDescriptor(), fileDescriptor.getStartOffset(), fileDescriptor.getDeclaredLength());
                mMediaPlayer.setDisplay(holder);
                mMediaPlayer.prepare();
    

    这些是我仅有的想法

    希望有帮助

        10
  •  1
  •   Akshay Khale    9 年前

    如果您正在处理远程URL,请使用下面的代码获得与MediaPlayer兼容的编码URL。

    public String getEncodedURL(String urlStr) throws Exception 
    {
                URL url = new URL(urlStr);
                URI uri = new URI(url.getProtocol(), url.getUserInfo(), url.getHost(), url.getPort(), url.getPath(), url.getQuery(), url.getRef());
                urlStr = uri.toASCIIString();
                return urlStr;
    }
    
        11
  •  1
  •   Ben    8 年前

    在我的例子中,它只是一个不喜欢的文件名:

    删除了连字符和冒号,异常就消失了。

        12
  •  1
  •   Erfan    8 年前

    我找到了解决此错误的最佳且清晰的解决方案: java.io.IOException: Prepare failed.: status=0x1

    注意


    <uses-permission android:name="android.permission.READ_EXTERNAL_STORAGE"/> 在你的手铐里。

    如果你想从url播放,并得到了错误,也许你的设置 setDataSource 喜欢这样: https://www.android.com 只要把它从 http 这样地 http://www.android.com

        13
  •  1
  •   Vasili Fedotov    6 年前

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

    因为我无法访问服务器URL(第三方)

    我不得不在android清单中添加以下内容。

    <application
        ...
        android:usesCleartextTraffic="true"
        ...
    </application>
    
        14
  •  0
  •   TouchBoarder    11 年前

    文件夹使用:

    mMediaPlayer = MediaPlayer.create(this, R.raw.a_video_or_audio_file);
    mMediaPlayer.start(); 
    

    使用时不需要调用prepare()媒体播放器.create(上下文,R。原始资源文件)

        15
  •  0
  •   sam winston    8 年前