studio play overview mediaplayer example developer create android video-streaming media-player file-descriptor

overview - play audio file android studio



Excepción al llamar al método setDataSource(FileDescriptor)(error: estado=0x80000000) (8)

Bueno, he llegado a la conclusión de que errores como:

Error de preparación: estado = 0x1 (al llamar a prepare ())

y

setDataSourceFD falló: estado = 0x80000000 (cuando se llama a setDataSourceFD ())

tiene que ver con el formato del archivo y probablemente significa que el archivo está incompleto, dañado o algo así ...

Como setDataSource en this enlace, encontré un video específico que funciona bien mientras lo transmito (aunque uso setDataSource , no setDataSourceFD ), pero no funcionará con la mayoría de los videos.

Estoy desarrollando una aplicación de transmisión de video y me estoy atascando al llamar a setDataSource con un FileDescriptor. Quiero que mi aplicación reproduzca el video mientras se descarga, así que una vez que obtenga un número mínimo de bytes, muevo esos bytes a otro archivo para que pueda reproducirse en otro archivo mientras se descarga en el archivo original.

Por lo tanto, compruebo si puedo iniciar la palier multimedia en cada paquete como este:

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

Este es el código del método 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; }

Muevo el archivo con el siguiente código:

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

Y finalmente creo el objeto MediaPlayer aquí:

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

Esta es la excepción que recibo:

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)

He estado toda la mañana atrapado aquí y realmente no encuentro información sobre ese error. Algunas personas me han dicho que use la ruta del archivo, pero obtengo la otra excepción de la que hablo en los comentarios (justo sobre la creación de FileInputStream).

Estoy realmente perdido aquí, cualquier ayuda sería muy apreciada.


En mi caso, cambiar de archivo wav a mp3 resolvió esta excepción con status = 0x80000000


En mi caso, el problema se debió a beasy sdcard cuando el dispositivo se montó como almacenamiento externo en la PC, por lo que al comprobar si el archivo está disponible se solucionó el problema. Tal vez ayuda a alguien


Estaba enfrentando el mismo problema al cargar el video desde el archivo de extensión obb. Lo arreglé reemplazando:

mPlayer.setDataSource(fd);

con:

mPlayer.setDataSource(fis.getFileDescriptor(),fis.getStartOffset(),fis.getLength());


No olvide el permiso

<uses-permission android:name="android.permission.INTERNET" />


Por lo que he leído, ciertos formatos de archivos de video tienen su información de "encabezado" en el FINAL del archivo. Por lo tanto, su FD debe ser una función de búsqueda de soporte para obtener el "encabezado" del final del archivo. Sospecho que su archivo de entrada al reproductor de medios falla cuando busca el "final" del archivo.

Estamos trabajando en los mismos temas, ¿has llegado más lejos?

Sean


Si está apuntando a Marshmallow o superior, asegúrese de haber solicitado el permiso Manifest.permission.WRITE_EXTERNAL_STORAGE correctamente. MediaMetadataRetriever muchas soluciones diferentes, incluida otra biblioteca que es una alternativa a MediaMetadataRetriever , pero resultó que una de mis rutas de código no solicitó el permiso adecuado.


teniendo el mismo error y habiendo leído la respuesta anterior en formato de archivo, abandoné el intento de configurar DataSource con mi archivo .mov y en lugar de eso, creé un video con mi cámara Telefon de Android que me dio un archivo .mp4. Pongo esto en el directorio Imágenes /. Esto funcionó - cound setDataSource sin errores. Espero que esto sea de utilidad para alguien.

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