wake-up-neo.com

Ausnahme beim Aufruf der Methode setDataSource (FileDescriptor) (fehlgeschlagen: Status = 0x80000000)

Ich entwickle eine Video-Streaming-Anwendung und halte fest, wenn setDataSource mit einem FileDescriptor aufgerufen wird. Ich möchte, dass meine Anwendung das Video während des Herunterladens abspielt Verschieben Sie diese Bytes in eine andere Datei, damit sie in einer anderen Datei abgespielt werden können, während sie in der Originaldatei heruntergeladen wird.

Ich überprüfe also, ob ich den Media Palyer jedes Paket so starten kann:

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();
                }
}

Dies ist der startMediaPlayer-Methodencode:

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;
}

Ich verschiebe die Datei mit folgendem Code:

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());
        }
    }
}

Und schließlich erstelle ich hier das MediaPlayer-Objekt:

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;
    }

Dies ist die Ausnahme, die ich bekomme:

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$4(StreamingMediaPlayer.Java:203)
01-25 16:03:15.663: ERROR/org.pfc.utils.StreamingMediaPlayer(2229):     at org.pfc.utils.StreamingMediaPlayer$2.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)

Ich bin den ganzen Morgen hier festgefahren und finde wirklich keine Informationen zu diesem Fehler. Einige Leute haben mir gesagt, dass ich den Dateipfad verwenden soll, aber ich bekomme die andere Ausnahme, über die ich in den Kommentaren spreche (direkt über der FileInputStream-Erstellung).

Ich bin hier wirklich verloren, jede Hilfe wäre sehr dankbar

29
Pedriyoo

Okay, ich bin zu dem Schluss gekommen, dass Fehler wie:

Vorbereiten fehlgeschlagen .: Status = 0x1 (beim Aufruf von prepare ())

und

setDataSourceFD fehlgeschlagen .: Status = 0x80000000 (beim Aufruf von setDataSourceFD ())

haben mit dem Dateiformat zu tun und bedeuten wahrscheinlich, dass die Datei unvollständig, beschädigt oder so ähnlich ist ...

Da ich in this link poste, habe ich ein bestimmtes Video gefunden, das beim Streaming gut funktioniert (obwohl ich setDataSource und nicht setDataSourceFD benutze), aber es funktioniert bei den meisten Videos nicht.

22
Pedriyoo

Erlaube nicht vergessen

<uses-permission Android:name="Android.permission.INTERNET" /> 
38
Crossle Song

Aus dem, was ich gelesen habe, haben bestimmte Videodateiformate ihre "Header" - Informationen über das ENDE der Datei. Ihre FD muss also eine Suchfunktion sein, um den "Header" vom Ende der Datei abzurufen. Ich vermute, Ihre Eingabedatei für den Mediaplayer schlägt fehl, wenn sie das "Ende" der Datei anstrebt.

Wir arbeiten an den gleichen Themen, die Sie weiter gebracht haben.

Sean 

1
Sean

nachdem ich den gleichen Fehler gelesen hatte und die Antwort oben im Dateiformat gelesen hatte, gab ich den Versuch auf, setDataSource mit meiner .mov-Datei zu setzen, und erstellte stattdessen ein Video mit meiner Android-Telefonkamera, die mir eine .mp4-Datei gab. __ Das Verzeichnis Pictures /. Das hat funktioniert - ich habe setDataSource ohne Fehler gefunden. Ich hoffe, das ist für jemanden nützlich.

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
Lawn

In meinem Fall wurde beim Wechseln von WAV-Datei zu MP3 diese Ausnahme mit dem Status 0x80000000 behoben

0
Hemant

Ich bin mit Pedriyoo einverstanden, ich habe versucht, die Ausnahme mit verschiedenen Videodateiformaten und aus den folgenden Videoformaten zu reproduzieren: AVI, MPG/MPEG, MOV, MOV, MP4, M4V, FLV, WMV. Mir ist aufgefallen, dass AVI, MPG/MPEG, und WMV warf jedes Mal eine Ausnahme für mich. Schließen Sie sie besser aus, bevor Sie die Methode ausführen, und schließen Sie sie mit einem try-catch ein.

0
waseefakhtar

Wenn Sie auf Marshmallow oder höher zielen, stellen Sie sicher, dass Sie die Manifest.permission.WRITE_EXTERNAL_STORAGE-Berechtigung ordnungsgemäß angefordert haben. Ich habe viele verschiedene Lösungen ausprobiert, einschließlich einer anderen Bibliothek, die eine Alternative zu MediaMetadataRetriever ist, aber es stellte sich heraus, dass einer meiner Codepfade nicht die erforderliche Berechtigung anforderte.

0
hansonchris

Ich war mit demselben Problem konfrontiert, als ich das Video aus der obb-Erweiterungsdatei lud.

mPlayer.setDataSource(fd); 

mit:

mPlayer.setDataSource(fis.getFileDescriptor(),fis.getStartOffset(),fis.getLength());
0
Usama Saeed US

In meinem Fall lag das Problem an einer ausgelasteten SD-Karte, wenn das Gerät als externer Speicher auf dem PC eingehängt ist. Wenn Sie also prüfen, ob die Datei verfügbar ist, wurde das Problem behoben. Vielleicht hilft es jemandem

0
vir us