Android MediaPlayer выбрасывает «Подготовка не удалась. Status = 0x1» на 2.1, работает на 2.2 - PullRequest
30 голосов
/ 21 сентября 2010

Я действительно ударился головой о стол, пытаясь заставить класс 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.

Тот же код работает отличново Фройо (2.2).Сами видео хорошо воспроизводятся в приложении видеоплеера.У кого-нибудь есть, возможно, полезный совет, который может помочь решить эту проблему?

Редактировать : Все еще нет решения - действительно очень неприятная проблема.Тем не менее, я обнаружил, что путем создания VideoView и установки URI для необработанного видео работает.Это очень озадачивает, поскольку отправка точно такого же URI через класс MediaPlayer приведет к ошибке.

Ответы [ 14 ]

28 голосов
/ 06 июня 2013

Это мое решение:

MediaPlayer mediaPlayer = new MediaPlayer();
FileInputStream fis = null;
try {
    fis = new FileInputStream(mp3File);
    mediaPlayer.setDataSource(fis.getFD());
    mediaPlayer.setAudioStreamType(AudioManager.STREAM_MUSIC);
    mediaPlayer.prepare();
}   finally {
    if (fis != null) {
        try {
            fis.close();
        } catch (IOException ignore) {
        }
    }

}
16 голосов
/ 16 августа 2012

Я не знаю, если это ваша проблема, но я только что нашел решение проблемы, описанной выше Tuszy.Я мог прочитать файл, который я создавал, из внешнего хранилища, но не из кэша.

Решение состоит в том, что права на чтение и запись при записи файла различаются.

Пожалуйста, посмотрите это превосходное объяснение в этом блоге, который я нашел.

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

enter image description here

enter image description here

7 голосов
/ 25 июля 2013

Я знаю, что опаздываю сюда, но, надеюсь, это поможет кому-то еще.Я обошел эту проблему, настроив обратный вызов 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.
    }
 }   
5 голосов
/ 23 декабря 2011

Если вы используете несколько экземпляров MediaPlayer, убедитесь, что вы выполнили release() для ресурса, прежде чем пытаться использовать его в другом экземпляре.

2 голосов
/ 28 апреля 2016

инициализация fileName, экземпляр 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());
        }

наконец остановка аудиофайла:

    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());
    }
2 голосов
/ 18 сентября 2012

По моему мнению, я попрошу вас проверить ваше местоположение ваших медиафайлов << SONG PATH или MOVIE PATH >>. Я столкнулся с этим исключением, я преодолел правильным "ПУТЬ ПЕСНИ"

2 голосов
/ 28 мая 2012

У меня была похожая проблема.У меня был zip-файл, который содержал звуковые файлы, которые были сжаты.Чтобы передать их на MediaPlayer, их нужно было распаковать.Когда я поместил их в каталог кэша приложения (context.getCacheDir()), MediaPlayer вернул ту же ошибку, которую вы описали.

Но когда я поместил их на внешнее хранилище (Environment.getExternalStorageDirectory()), все начало работать.

2 голосов
/ 13 января 2012

Я знаю, что это может быть слишком поздно. Мне удалось использовать видео из ресурсов, как это:

MediaPlayer mp = ...;
Uri uri = Uri.parse("android.resource://com.example.myapp/" + R.raw.my_movie");
mp.setDataSourceUri(this, uri);
1 голос
/ 13 марта 2018

В моем случае это было просто имя файла, которое ему не понравилось:
/storage/emulated/0/appname/2018-03-12T11:52:08Z.wav
Удалены дефисы и двоеточия,и исключение ушло.

1 голос
/ 03 апреля 2017

Если вы имеете дело с удаленным 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;
}
...