web-dev-qa-db-fra.com

Android MediaPlayer lance "La préparation a échoué .: status = 0x1" sous 2.1, fonctionne sous 2.2

Je me suis vraiment cogné la tête contre la table en essayant de faire lire à la classe MediaPlayer la lecture de vidéos codées en h.264 sur Android 2.1. Mon code est plutôt simple:

  AssetFileDescriptor fileDescriptor = getResources().openRawResourceFd(R.raw.my_movie);
  introMoviePlayer = new MediaPlayer();
  introMoviePlayer.setDataSource(fileDescriptor.getFileDescriptor(), fileDescriptor.getStartOffset(), fileDescriptor.getDeclaredLength());
  introMoviePlayer.prepare();

Cela lève toujours une exception à prepare(), avec le texte Java.io.IOException: Prepare failed.: status=0x1. J'ai eu un peu plus d'informations en utilisant MediaPlayer.create() avec un URI, qui lance également à prepare(), qui est en fait appelé par MediaPlayer.create(), avec le message Command PLAYER_PREPARE completed with an error or info PVMFErrResourceConfiguration.

Le même code fonctionne parfaitement dans Froyo (2.2). Les vidéos elles-mêmes jouent bien dans l'application du lecteur vidéo. Quelqu'un a-t-il peut-être un indice utile pour résoudre ce problème?

Edit : Toujours pas de solution - problème très frustrant en effet. Cependant, j'ai trouvé cela en créant une VideoView et en définissant l'URI de la vidéo brute. Cela est très surprenant, car envoyer exactement le même URI par le biais d’une classe MediaPlayer.

27
Nik Reiman

Je ne sais pas s'il s'agit de votre problème, mais je viens de trouver une solution au problème décrit par Tuszy ci-dessus. Je pouvais lire le fichier que je créais depuis le stockage externe mais pas depuis le cache. 

La solution est que les autorisations de lecture/écriture lors de l'écriture du fichier sont différentes. 

S'il vous plaît voir cette excellente explication dans ce blog, j'ai trouvé.

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

 enter image description here

 enter image description here

15
Ryan Heitner

Ceci est ma solution: 

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) {
        }
    }

}
26
MadMurdok

Je sais que je suis en retard, mais j'espère que cela aidera quelqu'un d'autre. J'ai résolu ce problème en configurant un rappel setOnCompletionListener qui libère explicitement l'objet MediaPlayer une fois la lecture du support terminée.

Je ne peux pas prendre le crédit pour cette solution, car elle a été posté par Ronny ici: Comment détectez-vous la fin d’un fichier son?

Mais puisqu'il s'agit de la première réponse lorsque je recherche Android + Status Failed 0x1, voici mon code qui a résolu ce problème pour moi:

 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.
    }
 }   
7
Anthony Roe

Si vous utilisez plusieurs instances de MediaPlayer, assurez-vous que vous avez exécuté release() sur une ressource avant de tenter de l'utiliser dans une autre instance.

5
Paul Lammertsma

initialiser le nom de fichier, instance du lecteur multimédia:

private MediaPlayer mp;
private final static String fileName = "ring";

pour lire/démarrer un fichier audio à partir du répertoire 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());
        }

arrêtant enfin le fichier audio: 

    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
ani0904071

Je sais que c'est peut-être trop tard. J'ai réussi à utiliser la vidéo à partir de ressources comme ceci:

MediaPlayer mp = ...;
Uri uri = Uri.parse("Android.resource://com.example.myapp/" + R.raw.my_movie");
mp.setDataSourceUri(this, uri);
2
Aleks G

À mon avis, je vous demanderai de vérifier l'emplacement de vos fichiers multimédias << SONG PATH ou MOVIE PATH >>. J'ai fait face à cette exception, j'ai surmonté par correct "SONG PATH"

2
SAWAUNG

J'avais un problème similaire. J'ai eu un fichier Zip qui contenait des fichiers audio qui ont été compressés. Afin de les transmettre à MediaPlayer, ils devaient être décompressés. Lorsque je les ai placés dans le répertoire de cache de l'application (context.getCacheDir()), MediaPlayer a renvoyé la même erreur que celle que vous avez décrite.

Mais lorsque je les ai placés sur un stockage externe (Environment.getExternalStorageDirectory()), tout a commencé à fonctionner.

2
srgtuszy

d'abord merci pour votre code, la ressource ouverte brute m'a aidé avec mon problème.

Je suis désolé, je n'ai pas de réponse précise à votre problème, mais, en me basant sur l'exemple de média api dans le SDK et sur le lecteur multimédia de mon projet, je suggère de vérifier que le fichier s'ouvre correctement.

sinon, vous devez peut-être paramétrer l’affichage avant de vous préparer comme tel:

mMediaPlayer = new MediaPlayer();
            mMediaPlayer.setDataSource(fileDescriptor.getFileDescriptor(), fileDescriptor.getStartOffset(), fileDescriptor.getDeclaredLength());
            mMediaPlayer.setDisplay(holder);
            mMediaPlayer.prepare();

ce sont les seules idées que j'ai

j'espère que ça aide

Jason

1
Jason Rogers

J'ai trouvé la meilleure solution claire pour cette erreur: Java.io.IOException: Prepare failed.: status=0x1

Remarque

si vous voulez lire sur votre carte SD et obtenu cette erreur, vous n'êtes pas réglé
<uses-permission Android:name="Android.permission.READ_EXTERNAL_STORAGE"/> dans votre Manifast.

Note 2

si vous voulez jouer à partir de l'URL et que vous avez cette erreur, vous êtes peut-être configuré avec setDataSource comme ceci: https://www.Android.com supprimez simplement S de http comme ceci http://www.Android.com

1
erfan

Dans mon cas, c'était juste un nom de fichier qui ne l'aimait pas:
/storage/emulated/0/appname/2018-03-12T11: 52: 08Z.wav
Supprimé les traits d'union et les deux-points et l'exception disparut.

1
Ben

Si vous utilisez une URL distante, utilisez le code ci-dessous pour obtenir une URL encodée compatible avec 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;
}
1
Rakesh Patil

Pour lire un fichier vidéo ou audio situé dans le dossier raw , utilisez:

mMediaPlayer = MediaPlayer.create(this, R.raw.a_video_or_audio_file);
mMediaPlayer.start(); 

pas besoin d'appeler prepare () lors de l'utilisation de MediaPlayer.create (Context, R.raw.some_resource_file)

0
TouchBoarder

la lecture de fichiers mp3 au lieu de wmva a corrigé le problème. Apparemment, ce n'est pas un problème sur l'API 19 

0
sam winston