Подтвердить что ты не робот

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 будет бросаться.

4b9b3361

Ответ 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

В моем случае файлы имеют огромный битрейт.