Exception lors de l'appel de la méthode setDataSource(FileDescriptor) (échec.: statut=0x80000000)

je développe une application de streaming vidéo et je suis bloqué en appelant setdatasource avec un FileDescriptor. Je veux que mon application joue la vidéo comme il est téléchargé, donc une fois que j'obtiens un nombre minimum d'octets, je déplace ces octets à un autre fichier afin qu'il puisse être joué dans un autre fichier pendant qu'il est téléchargé dans le fichier original.

donc, je vérifie si je peux démarrer le media palyer chaque paquet comme ceci:

if (mediaPlayer == null) {
                    // Only create the MediaPlayer once we have the minimum
                    // buffered data
                    if (totalKbRead >= INTIAL_KB_BUFFER) {
                        try {
                            startMediaPlayer();
                        } catch (Exception e) {
                            Log.e(getClass().getName(),
                                    "Error copying buffered conent.", e);
                        }
                    }
                } else if (mediaPlayer.getDuration()
                        - mediaPlayer.getCurrentPosition() <= 1000) {
                    transferBufferToMediaPlayer();
                }
}

C'est le code de la méthode startMediaPlayer:

private void startMediaPlayer() {
        try {
            File bufferedFile = new File(context.getCacheDir(), "playingMedia"
                    + (counter++) + ".dat");

            // bufferedFile is the one that'll be played
            moveFile(downloadingMediaFile, bufferedFile);

            mediaPlayer = createMediaPlayer(bufferedFile);

            mediaPlayer.start();

            playButton.setEnabled(true);
        } catch (IOException e) {
            Log.e(getClass().getName(), "Error initializing the MediaPlayer.",
                    e);
            return;
}

je déplace le fichier avec le code suivant:

public void moveFile(File oldLocation, File newLocation) throws IOException {

        if (oldLocation.exists()) {
            BufferedInputStream reader = new BufferedInputStream(
                    new FileInputStream(oldLocation));
            BufferedOutputStream writer = new BufferedOutputStream(
                    new FileOutputStream(newLocation, false));
            try {
                byte[] buff = new byte[8192];
                int numChars;
                while ((numChars = reader.read(buff, 0, buff.length)) != -1) {
                    writer.write(buff, 0, numChars);
                }
            } catch (IOException ex) {
                throw new IOException("IOException when transferring "
                        + oldLocation.getPath() + " to "
                        + newLocation.getPath());
            } finally {
                try {
                    if (reader != null) {
                        writer.flush();
                        writer.close();
                        reader.close();
                    }
                } catch (IOException ex) {
                    Log.e(getClass().getName(),
                            "Error closing files when transferring "
                                    + oldLocation.getPath() + " to "
                                    + newLocation.getPath());
                }
            }
        } else {
            throw new IOException(
                    "Old location does not exist when transferring "
                            + oldLocation.getPath() + " to "
                            + newLocation.getPath());
        }
    }
}

et je crée finalement L'objet MediaPlayer ici:

private MediaPlayer createMediaPlayer(File mediaFile) throws IOException {

        if(mediaPlayer != null){
            mediaPlayer.release();
        }

        MediaPlayer mPlayer = new MediaPlayer();
        mPlayer.setOnErrorListener(new MediaPlayer.OnErrorListener() {
            public boolean onError(MediaPlayer mp, int what, int extra) {
                Log.e(getClass().getName(), "Error in MediaPlayer: (" + what
                        + ") with extra (" + extra + ")");
                return false;
            }
        });

        // It appears that for security/permission reasons, it is better to pass
        // a FileDescriptor rather than a direct path to the File.
        // Also I have seen errors such as "PVMFErrNotSupported" and
        // "Prepare failed.: status=0x1" if a file path String is passed to
        // setDataSource().
        FileInputStream fis = new FileInputStream(mediaFile);

        mPlayer.reset();
        FileDescriptor fd = fis.getFD();
        mPlayer.setDataSource(fd);       // IM GETTING THE EXCEPTION HERE
        mPlayer.setDisplay(mHolder);
        mPlayer.prepare();
        return mPlayer;
    }

C'est l'exception que j'obtiens:

01-25 16:03:15.663: ERROR/org.pfc.utils.StreamingMediaPlayer(2229): Error initializing the MediaPlayer.
01-25 16:03:15.663: ERROR/org.pfc.utils.StreamingMediaPlayer(2229): java.io.IOException: setDataSourceFD failed.: status=0x80000000
01-25 16:03:15.663: ERROR/org.pfc.utils.StreamingMediaPlayer(2229):     at android.media.MediaPlayer.setDataSource(Native Method)
01-25 16:03:15.663: ERROR/org.pfc.utils.StreamingMediaPlayer(2229):     at android.media.MediaPlayer.setDataSource(MediaPlayer.java:854)
01-25 16:03:15.663: ERROR/org.pfc.utils.StreamingMediaPlayer(2229):     at org.pfc.utils.StreamingMediaPlayer.createMediaPlayer(StreamingMediaPlayer.java:266)
01-25 16:03:15.663: ERROR/org.pfc.utils.StreamingMediaPlayer(2229):     at org.pfc.utils.StreamingMediaPlayer.startMediaPlayer(StreamingMediaPlayer.java:226)
01-25 16:03:15.663: ERROR/org.pfc.utils.StreamingMediaPlayer(2229):     at org.pfc.utils.StreamingMediaPlayer.access(StreamingMediaPlayer.java:203)
01-25 16:03:15.663: ERROR/org.pfc.utils.StreamingMediaPlayer(2229):     at org.pfc.utils.StreamingMediaPlayer.run(StreamingMediaPlayer.java:183)
01-25 16:03:15.663: ERROR/org.pfc.utils.StreamingMediaPlayer(2229):     at android.os.Handler.handleCallback(Handler.java:587)
01-25 16:03:15.663: ERROR/org.pfc.utils.StreamingMediaPlayer(2229):     at android.os.Handler.dispatchMessage(Handler.java:92)
01-25 16:03:15.663: ERROR/org.pfc.utils.StreamingMediaPlayer(2229):     at android.os.Looper.loop(Looper.java:144)
01-25 16:03:15.663: ERROR/org.pfc.utils.StreamingMediaPlayer(2229):     at android.app.ActivityThread.main(ActivityThread.java:4937)
01-25 16:03:15.663: ERROR/org.pfc.utils.StreamingMediaPlayer(2229):     at java.lang.reflect.Method.invokeNative(Native Method)
01-25 16:03:15.663: ERROR/org.pfc.utils.StreamingMediaPlayer(2229):     at java.lang.reflect.Method.invoke(Method.java:521)
01-25 16:03:15.663: ERROR/org.pfc.utils.StreamingMediaPlayer(2229):     at com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:868)
01-25 16:03:15.663: ERROR/org.pfc.utils.StreamingMediaPlayer(2229):     at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:626)
01-25 16:03:15.663: ERROR/org.pfc.utils.StreamingMediaPlayer(2229):     at dalvik.system.NativeStart.main(Native Method)

j'ai été coincé ici toute la matinée et je ne trouve vraiment aucune information sur cette erreur. Certaines personnes m'ont dit d'utiliser le chemin du fichier, mais j'ai l'autre exception dont je parle dans les commentaires (directement sur la création de FileInputStream).

je suis vraiment perdu ici, toute aide serait très appréciée

26
demandé sur Pedriyoo 2011-01-25 18:10:36

8 réponses

N'oubliez pas la permission

<uses-permission android:name="android.permission.INTERNET" /> 
34
répondu Crossle Song 2013-04-16 05:58:01

D'accord, je suis arrivé à la conclusion que des erreurs comme:

préparer échoué.: statut=0x1 (lors de l'appel de préparation() )

et

setDataSourceFD a échoué.: statut=0x80000000 (lors de l'appel de setDataSourceFD() )

a à voir avec le format de fichier et signifie probablement que le fichier est incomplet, corrompu ou quelque chose comme ça...

comme j'ai posté dans ce lien , j'ai trouvé une vidéo spécifique qui fonctionne bien en streaming (bien que j'utilise setDataSource , pas setDataSourceFD ), mais il ne fonctionnera pas avec la plupart des vidéos.

22
répondu Pedriyoo 2017-07-20 09:44:36

ayant la même erreur, et ayant lu la réponse ci-dessus sur le format de fichier, j'ai abandonné en essayant de définir datasource avec mon .mov fichier et à la place créé une vidéo avec mon appareil photo Android Telefon qui m'a donné un .fichier mp4. J'ai mis cela dans le répertoire Images/. Cela a fonctionné - j'ai compté setDataSource sans erreurs. J'espère que c'est utile à quelqu'un.

File mediaStorageDir = new         File(Environment.getExternalStoragePublicDirectory(
                Environment.DIRECTORY_PICTURES),     "MyDirectoryUnderPictures");
File mediaFile_mp4_android;
mediaFile_mp4_android = new File(mediaStorageDir.getPath()
                    + File.separator
                    + "mp4_test"
                    + ".mp4"); //video taken with android camera
String filePath_mp4_android = String.valueOf(mediaFile_mp4_android);
File file_mp4_android = new File(filePath_mp4_android);
Uri contentUri = Uri.fromFile(file_mp4_android);
MediaMetadataRetriever mmr = new MediaMetadataRetriever();
mmr.setDataSource(String.valueOf(contentUri));
1
répondu Lawn 2015-06-22 12:04:56

de ce que j'ai lu, certains formats de fichiers vidéo ont leur " en-tête " informations à la fin du fichier. Ainsi, votre FD doit être la fonction de recherche de soutien pour obtenir l '"en-tête" à partir de la fin du fichier. Je soupçonne que votre fichier d'entrée pour lecteur multimédia échoue lorsqu'il cherche à la "fin" du fichier.

Nous travaillons sur les mêmes questions avez-vous obtenu?

Sean

0
répondu Sean 2012-10-11 06:25:04

dans mon cas commutation du fichier wav à mp3 résolu cette exception avec statut=0x80000000

0
répondu Hemant 2013-02-16 06:29:28

dans mon cas, le problème était dû à la carte Beasy sdcard lorsque le périphérique a été monté en tant que stockage exteranl sur pc donc vérifier si le fichier est disponible a résolu le problème. Peut-être cela aide quelqu'un

0
répondu vir us 2014-02-28 13:07:38

si vous ciblez des marshmallows ou plus, assurez-vous d'avoir demandé la permission Manifest.permission.WRITE_EXTERNAL_STORAGE correctement. J'ai essayé de nombreuses solutions différentes, y compris une autre bibliothèque qui est une alternative à MediaMetadataRetriever , mais il s'est avéré que l'un de mes chemins de code n'a pas demandé la permission appropriée.

0
répondu hansonchris 2017-06-14 13:10:50

je faisais face au même problème en chargeant la vidéo à partir du fichier d'extension obb. je l'ai corrigé en remplaçant:

mPlayer.setDataSource(fd); 

avec:

mPlayer.setDataSource(fis.getFileDescriptor(),fis.getStartOffset(),fis.getLength());
0
répondu Usama Saeed US 2018-01-29 23:54:04