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 中没有设置<uses-permission android:name="android.permission.READ_EXTERNAL_STORAGE"/>
。
注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 上播放音频时遇到问题