【问题标题】:Android MediaPlayer throwing "Prepare failed.: status=0x1" on 2.1, works on 2.2Android MediaPlayer 在 2.1 上抛出“准备失败。:状态 = 0x1”,适用于 2.2
【发布时间】:2011-04-15 05:57:43
【问题描述】:

我一直在努力让 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();

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

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

编辑:仍然没有解决方案——确实是非常令人沮丧的问题。但是,我发现通过创建 VideoView 并设置原始视频的 URI 可以正常工作。这很令人费解,因为通过 MediaPlayer 类发送完全相同的 URI 会抛出异常。

【问题讨论】:

  • 如果您将文件存储在 SD 卡中并通过自己的路径,您是否尝试过该代码?
  • 为时已晚,但我猜 mediaplayer 的构造函数有一个需要 resourceId 的重载
  • 就我而言,我在 url 信息所在的网址上进行了 Gzip 压缩。压缩的媒体文件可能无法在 android 上解码。

标签: android media-player


【解决方案1】:

这是我的解决方案:

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) {
        }
    }

}

【讨论】:

  • 只是对本地文件的提醒。如果 MediaPlayer.setDataSource(String path) 有准备错误,则此解决方法也不起作用。由于在MediaPlayer.setDataSource(String path)的后台逻辑中,也使用了setDataSource(FileDescriptor fd)。
【解决方案2】:

我不知道这是否是您的问题,但我刚刚找到了解决上述 Tuszy 所描述问题的方法。我可以从外部存储中读取我正在创建的文件,但不能从缓存中读取。

解决办法是写文件时的读写权限不同。

请在我找到的这个博客中查看这个出色的解释。

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

【讨论】:

  • 我不再在有这个问题的同一家公司工作,所以我不能确定该解决方案是否能解决这个问题。但是,我将把它标记为正确答案,因为它是迄今为止我在这个相当晦涩的错误上看到的最好的资源。
  • 我认为这个博客已经不存在了。请在此处提供答案。
  • 我设法从存档站点中挖掘出博客。一旦你成为网络中的一员,它就会永远存在。
【解决方案3】:

我知道我在这里迟到了,但希望这对其他人有所帮助。我通过设置setOnCompletionListener 回调来解决此问题,该回调在媒体播放完毕后显式释放 MediaPlayer 对象。

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

但由于这是我搜索 Android+Failed Status 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】:

    如果其他人在从远程 URL 读取时遇到此问题,

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

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

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

    <application
        ...
        android:usesCleartextTraffic="true"
        ...
    </application>
    

    【讨论】:

      【解决方案5】:

      如果您使用MediaPlayer 的多个实例,请确保您已在资源上执行release(),然后再尝试在其他实例中使用它。

      【讨论】:

        【解决方案6】:

        初始化文件名​​、媒体播放器实例:

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

        用于从 res/raw 目录播放/启动音频文件:

                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());
            }
        

        【讨论】:

          【解决方案7】:

          我遇到了类似的问题。我有一个 zip 文件,其中包含压缩的声音文件。为了将它们传递给MediaPlayer,它们需要被解压缩。当我将它们放在应用程序的缓存目录 (context.getCacheDir()) 中时,MediaPlayer 返回了与您描述的相同的错误。

          但是当我将它们放在外部存储 (Environment.getExternalStorageDirectory()) 上时,一切都开始工作了。

          【讨论】:

          • 我还把它们放在了外部存储上(Environment.getExternalStorageDirectory()),一切都开始工作了。
          【解决方案8】:

          在我看来,我会要求您检查您的媒体文件的位置>。我遇到了这个例外,我已经通过正确的“SONG PATH”克服了

          【讨论】:

            【解决方案9】:

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

            注意

            如果您想从您的 SD 卡中读取并收到此错误,则您的 Manifast 中没有设置
            &lt;uses-permission android:name="android.permission.READ_EXTERNAL_STORAGE"/&gt;

            注2

            如果您想从 url 播放并收到该错误,则可能您将 setDataSource 设置为这样 :https://www.android.com 只需从 http 中删除 S 就像这样 http://www.android.com

            【讨论】:

              【解决方案10】:

              我知道这可能为时已晚。我设法使用来自资源的视频:

              MediaPlayer mp = ...;
              Uri uri = Uri.parse("android.resource://"+getPackageName()+"/" + R.raw.my_movie);
              mp.setDataSourceUri(this, uri);
              

              【讨论】:

                【解决方案11】:

                首先感谢您的代码,开放的原始资源帮助我解决了我的问题。

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

                否则您可能需要在准备之前设置显示:

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

                这些是我唯一的想法

                希望对你有帮助

                杰森

                【讨论】:

                • 嗨,我面临同样的问题。我这样的代码--- MediaPlayer mMediaPlayer=new MediaPlayer();字符串 PATH_TO_FILE=this.getFilesDir()+"/Organic_chemistry/new_audio.mp3"; mMediaPlayer.setDataSource(PATH_TO_FILE); mMediaPlayer.prepare();
                【解决方案12】:

                如果您正在处理远程 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;
                }
                

                【讨论】:

                  【解决方案13】:

                  在我的情况下,它只是一个不喜欢的文件名:
                  /storage/emulated/0/appname/2018-03-12T11:52:08Z.wav
                  删除了连字符和冒号,异常消失了。

                  【讨论】:

                  • Same.. 文件本身应该在没有连字符、冒号和斜线的情况下更新。
                  【解决方案14】:

                  要播放位于 raw 文件夹中的视频或音频文件,请使用:

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

                  使用 MediaPlayer.create(Context,R.raw.some_resource_file) 时无需调用 prepare()

                  【讨论】:

                    【解决方案15】:

                    播放 mp3 文件而不是 wmva 修复了它。显然这在 API 19 上不是问题

                    【讨论】:

                      猜你喜欢
                      • 1970-01-01
                      • 1970-01-01
                      • 1970-01-01
                      • 1970-01-01
                      • 1970-01-01
                      • 1970-01-01
                      • 1970-01-01
                      • 2011-07-18
                      • 1970-01-01
                      相关资源
                      最近更新 更多