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
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.
Erlaube nicht vergessen
<uses-permission Android:name="Android.permission.INTERNET" />
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
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));
In meinem Fall wurde beim Wechseln von WAV-Datei zu MP3 diese Ausnahme mit dem Status 0x80000000 behoben
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.
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.
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());
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