Exception lors de l'appel de setDataSource(FileDescriptor) méthode (échec.: statut=0x80000000)
Je suis le développement d'une application de streaming vidéo et je suis coincé lors de l'appel de définir setDataSource avec un FileDescriptor.
Je veux que mon application pour lire la vidéo, il est en cours de téléchargement, donc une fois que je reçois un nombre minimum d'octets, je me déplace ces octets à un autre fichier de sorte qu'il peut être joué dans un autre fichier alors qu'il est en cours de téléchargement dans le fichier d'origine.
Donc, je vérifie si je peux commencer le media palyer pour chaque paquet de données 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 startMediaPlayer le code de la méthode:
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 j'ai enfin créer le MediaPlayer objet 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 le excepction 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$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)
J'ai été toute la matinée coincé ici et j'ai vraiment trouver aucune information sur cette erreur. Certaines personnes m'ont dit d'utiliser le chemin d'accès au fichier, mais j'ai l'autre exception que je parle dans les commentaires (à droite sur la FileInputStream création).
Je suis vraiment perdu ici, toute aide serait très appréciée
Vous devez vous connecter pour publier un commentaire.
N'oublie pas de permission
D'accord, j'en suis arrivé à la conclusion que des erreurs de ce type:
et
avoir à faire avec le format de fichier et probablement dire que le dossier est incomplet, endommagé ou quelque chose comme ça...
Comme je l'ai poster dans cette lien, j'ai trouvé une vidéo qui fonctionne très bien pendant la diffusion (même si j'utilise
setDataSource
, passetDataSourceFD
), mais il ne veux pas travailler avec la plupart des vidéos.De ce que j'ai lu, certains formats de fichier vidéo ont leur "en-tête" des informations sur la FIN du fichier. Ainsi, vos FD doit être en charge la fonction de recherche pour obtenir la "tête" 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 plus?
Sean
ayant la même erreur, et après avoir lu la réponse ci-dessus sur le format de fichier, j'ai abandonné d'essayer de setDataSource avec mon .fichier mov et plutôt créé une vidéo avec mon Android Telefon Appareil photo qui m'a donné une .fichier mp4.
J'ai mis cela dans le répertoire Images/.
Cette travaillé - je cound setDataSource sans erreurs.
J'espère que c'est utile à quelqu'un.
Dans mon cas de commutation à partir de fichier wav en mp3 résolu cette exception avec le statut=0x80000000
Dans mon cas, le problème a été en raison de beasy sdcard lorsque l'appareil a été monté comme exteranl de stockage pour pc afin de vérifier si le fichier est disponible résolu le problème. Peut-être que ça aide quelqu'un
Si vous ciblez la Guimauve ou plus, assurez-vous que vous avez demandé la
Manifest.permission.WRITE_EXTERNAL_STORAGE
autorisation correctement. J'ai essayé beaucoup de différentes solutions, y compris d'une autre bibliothèque qui est une alternative àMediaMetadataRetriever
, mais il s'est avéré que l'un de mes chemins de code ne demande pas l'autorisation appropriée.J'ai été confrontée au même problème lors du chargement de la vidéo à partir d'obb l'extension de fichier.
je l'ai corrigé en remplaçant:
avec:
fis
?