Android MediaPlayer 在 2.1 上抛出“准备失败。:状态 = 0x1”,适用于 2.2

Posted

技术标签:

【中文标题】Android MediaPlayer 在 2.1 上抛出“准备失败。:状态 = 0x1”,适用于 2.2【英文标题】:Android MediaPlayer throwing "Prepare failed.: status=0x1" on 2.1, works on 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 上解码。 【参考方案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 上不是问题

【讨论】:

以上是关于Android MediaPlayer 在 2.1 上抛出“准备失败。:状态 = 0x1”,适用于 2.2的主要内容,如果未能解决你的问题,请参考以下文章

Android 音频开发之 MediaPlayer

Android:MediaPlayer 未发布就完成了

在 Android 的 MediaPlayer 上播放音频时遇到问题

在 Android 中是不是可以录制 MediaPlayer 播放的内容?

Android -- MediaPlayer内部实现简析

Android MediaPlayer setDataSource failed