Android MediaPlayer бросает "Подготовить неудачно: статус = 0x1" на 2.1, работает на 2.2
Я действительно ударился головой о стол, пытаясь заставить класс MediaPlayer попытаться воспроизвести h.264-кодированные видео на Android 2.1. Мой код довольно прост:
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()
с URI, который также бросает на prepare()
, который фактически вызывается MediaPlayer.create()
, с сообщением Command PLAYER_PREPARE completed with an error or info PVMFErrResourceConfiguration
.
Тот же код отлично работает в Froyo (2.2). Сами видео отлично воспроизводятся в приложении для видеоплеера. Есть ли у кого-нибудь полезный намек, который может помочь решить эту проблему?
Изменить. По-прежнему нет решения - очень неприятная проблема. Однако я обнаружил, что создав VideoView
и установив URI для необработанного видео. Это очень озадачивает, так как отправка этого же URI через класс MediaPlayer будет бросаться.
Ответы
Ответ 1
Я не знаю, если это ваша проблема, но я только что нашел решение проблемы, описанной выше Tuszy. Я мог прочитать файл, который я создавал, из внешнего хранилища, но не из кэша.
Решение состоит в том, что права на чтение и запись при записи файла различаются.
Пожалуйста, посмотрите это превосходное объяснение в этом блоге, который я нашел.
http://blog.weston-fl.com/android-mediaplayer-prepare-throws-status0x1-error1-2147483648/
![enter image description here]()
![enter image description here]()
Ответ 2
Это мое решение:
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
Я знаю, что опаздываю, но, надеюсь, это помогает кому-то другому. Я работал над этой проблемой, настроив обратный вызов setOnCompletionListener
, который явно освобождает объект MediaPlayer после воспроизведения медиа.
Я не могу взять кредит на это решение, поскольку он был первоначально размещен Ронни здесь:
Как вы обнаруживаете, когда звуковой файл закончился?
Но так как это первый ответ, когда я ищу 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
Если вы используете несколько экземпляров MediaPlayer
, убедитесь, что вы выполнили release()
на ресурсе, прежде чем пытаться использовать его в другом экземпляре.
Ответ 5
Я знаю, что это может быть слишком поздно. Мне удалось использовать видео из ресурсов, как это:
MediaPlayer mp = ...;
Uri uri = Uri.parse("android.resource://"+getPackageName()+"/" + R.raw.my_movie);
mp.setDataSourceUri(this, uri);
Ответ 6
У меня была аналогичная проблема. У меня был zip файл, в котором содержались звуковые файлы, которые были сжаты. Чтобы передать их на MediaPlayer
, они должны были быть несжатыми. Когда я поместил их в каталог кэша приложений (context.getCacheDir()
), MediaPlayer
вернул ту же самую ошибку, о которой вы описали.
Но когда я разместил их на внешнем хранилище (Environment.getExternalStorageDirectory()
), все заработало.
Ответ 7
По моему мнению, я попрошу вас проверить свое местоположение ваших медиафайлов < < ПЕСНЯ ПУТЬ или ПУТЬ ВИДЕО → . Я столкнулся с этим исключением, я преодолел правильный "SONG PATH"
Ответ 8
инициализировать имя_файла, экземпляр mediaPlayer:
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());
}
наконец, остановка audioFile:
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());
}
Ответ 9
первое спасибо за ваш код, открытый исходный ресурс помог мне с моей проблемой.
Извините, у меня нет определенного ответа на вашу проблему, но на основе примера api media в SDK и моего медиаплеера в моем проекте я бы предложил проверить, что файл открывается правильно.
иначе, возможно, вам нужно установить дисплей перед подготовкой как таковой:
mMediaPlayer = new MediaPlayer();
mMediaPlayer.setDataSource(fileDescriptor.getFileDescriptor(), fileDescriptor.getStartOffset(), fileDescriptor.getDeclaredLength());
mMediaPlayer.setDisplay(holder);
mMediaPlayer.prepare();
это единственные идеи, которые у меня есть
надеюсь, что это поможет
Джейсон
Ответ 10
Я нашел лучшее и ясное решение для этой ошибки: java.io.IOException: Prepare failed.: status=0x1
Заметка
если вы хотите прочитать с вашей SD-карты и получили эту ошибку, вы не установлены
<uses-permission android:name="android.permission.READ_EXTERNAL_STORAGE"/>
в вашем Manifast.
Заметка 2
Если вы хотите воспроизвести с URL- setDataSource
и получили эту ошибку, возможно, вы настроили setDataSource
следующим образом: https://www.android.com
просто удалите S из http
как это http://www.android.com
Ответ 11
Если вы имеете дело с удаленным URL-адресом, используйте код ниже, чтобы получить кодированный URL-адрес, совместимый с MediaPlayer.
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;
}
Ответ 12
В моем случае это было просто имя файла, которое ему не понравилось:
/storage/emulated/0/appname/2018-03-12T11:52:08Z.wav
Удалены дефисы и двоеточия, и исключение ушло.
Ответ 13
Для воспроизведения видео или аудиофайла, расположенного в папке raw, используйте:
mMediaPlayer = MediaPlayer.create(this, R.raw.a_video_or_audio_file);
mMediaPlayer.start();
нет необходимости вызывать prepare() при использовании MediaPlayer.create(Context, R.raw.some_resource_file)
Ответ 14
Воспроизведение mp3 файлов вместо wmva исправило это. Очевидно, это не проблема для API 19
Ответ 15
В моем случае файлы имеют огромный битрейт.