Reproducir un archivo m3u8 local en android mostrando setDataSourceFD failed .: status = 0x80000000

Estoy intentando jugar un archivo m3u8 local que se almacena en mi sdcard usando la clase android mediaplayer. El archivo m3u8 y los archivos .ts están en el mismo directorio. Los jugadores de terceros como MXPlayer se une a los archivos ts y reproduce el video cuando abro el m3u8 de él. Pero el uso de la clase android mediaplayer arroja el siguiente error `

No se pudo crear el error del reproductor de medios: setDataSourceFD falló .: status = 0x80000000 java.io.IOException: setDataSourceFD failed .: status = 0x80000000 en android.media.MediaPlayer.setDataSource (Método nativo) en android.media.MediaPlayer.setDataSource (MediaPlayer .java: 1204) en com.tcs.hlsvideo.StreamingPlayer.playVideo (StreamingPlayer.java:87) en com.tcs.hlsvideo.StreamingPlayer.surfaceCreated (StreamingPlayer.java:148) en android.view.SurfaceView.updateWindow (SurfaceView. Java: 609) en android.view.SurfaceView.access $ 000 (SurfaceView.java:86) en android.view.SurfaceView $ 3.onPreDraw (SurfaceView.java:178) en android.view.ViewTreeObserver.dispatchOnPreDraw (ViewTreeObserver.java:707 ) En android.view.ViewRootImpl.performTraversals (ViewRootImpl.java:1981) en android.view.ViewRootImpl.doTraversal (ViewRootImpl.java:1143) en android.view.ViewRootImpl $ TraversalRunnable.run (ViewRootImpl.java:4667) en android .view.Choreographer $ CallbackRecord.run (Choreographer.java:725) en android.view.Choreographer.doCa Llbacks (Choreographer.java:555) en android.view.Choreographer.doFrame (Choreographer.java:525) en android.view.Choreographer $ FrameDisplayEventReceiver.run (Choreographer.java:711) en android.os.Handler.handleCallback (Handler .java: 93) en android.os.Handler.dispatchMessage (Handler.java:92) en android.os.Looper.loop (Looper.java:137) en android.app.ActivityThread.main (ActivityThread.java:4960) En java.lang.reflect.Method.invokeNative (Método nativo) en java.lang.reflect.Method.invoke (Method.java:511) en com.android.internal.os.ZygoteInit $ MethodAndArgsCaller.run (ZygoteInit.java: 1038) en com.android.internal.os.ZygoteInit.main (ZygoteInit.java:805) en dalvik.system.NativeStart.main (método nativo) setDataSourceFD failed .: status = 0x80000000

El código que he usado es

private static final String TAG = StreamingPlayer.class.getSimpleName(); private String formatedIpAddress; private int mVideoWidth; private int mVideoHeight; private MediaPlayer mMediaPlayer; private SurfaceView mPreview; private SurfaceHolder holder; private String path; //private boolean mIsVideoSizeKnown = false; private boolean mIsVideoReadyToBePlayed = false; @Override protected void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); mPreview = new SurfaceView(this); holder = mPreview.getHolder(); holder.addCallback(this); setContentView(mPreview); WifiManager wifiManager = (WifiManager) getSystemService(WIFI_SERVICE); int ipAddress = wifiManager.getConnectionInfo().getIpAddress(); formatedIpAddress = String.format("%d.%d.%d.%d", (ipAddress & 0xff), (ipAddress >> 8 & 0xff), (ipAddress >> 16 & 0xff), (ipAddress >> 24 & 0xff)); Log.d(TAG, formatedIpAddress); } private void playVideo() { doCleanUp(); try { //local m3u8 file path = Environment.getExternalStorageDirectory().getAbsolutePath() + "/ts/prog_index.m3u8"; if (path == "") { // Tell the user to provide a media file URL. Toast .makeText( this, "Please edit MediaPlayerDemo_Video Activity," + " and set the path variable to your media file URL.", Toast.LENGTH_LONG).show(); } Log.e("PATH", "Path = " + path); // Create a new media player and set the listeners mMediaPlayer = new MediaPlayer(); //mMediaPlayer.SET mMediaPlayer.setDataSource(path); mMediaPlayer.setDisplay(holder); mMediaPlayer.setOnBufferingUpdateListener(this); mMediaPlayer.setOnPreparedListener(this); mMediaPlayer.prepare(); mMediaPlayer.setOnCompletionListener(this); mMediaPlayer.setOnVideoSizeChangedListener(this); mMediaPlayer.setAudioStreamType(AudioManager.STREAM_MUSIC); } catch (Exception e) { Log.e(TAG, "error: " + e.getMessage(), e); Log.e(TAG, e.getMessage()); } } public void onBufferingUpdate(MediaPlayer arg0, int percent) { Log.d(TAG, "onBufferingUpdate percent:" + percent); } public void onCompletion(MediaPlayer arg0) { Log.d(TAG, "onCompletion called"); } public void onVideoSizeChanged(MediaPlayer mp, int width, int height) { Log.v(TAG, "onVideoSizeChanged called"); if (width == 0 || height == 0) { Log.e(TAG, "invalid video width(" + width + ") or height(" + height + ")"); return; } //mIsVideoSizeKnown = true; mVideoWidth = width; mVideoHeight = height; //&& mIsVideoSizeKnown if (mIsVideoReadyToBePlayed ) { startVideoPlayback(); } } public void onPrepared(MediaPlayer mediaplayer) { Log.d(TAG, "onPrepared called"); mIsVideoReadyToBePlayed = true; //&& mIsVideoSizeKnown if (mIsVideoReadyToBePlayed ) { startVideoPlayback(); } } public void surfaceChanged(SurfaceHolder surfaceholder, int i, int j, int k) { Log.d(TAG, "surfaceChanged called"); } public void surfaceDestroyed(SurfaceHolder surfaceholder) { Log.d(TAG, "surfaceDestroyed called"); } public void surfaceCreated(SurfaceHolder holder) { Log.d(TAG, "surfaceCreated called"); playVideo(); } @Override protected void onPause() { super.onPause(); releaseMediaPlayer(); doCleanUp(); } @Override protected void onDestroy() { super.onDestroy(); releaseMediaPlayer(); doCleanUp(); } private void releaseMediaPlayer() { if (mMediaPlayer != null) { mMediaPlayer.release(); mMediaPlayer = null; } } private void doCleanUp() { mVideoWidth = 0; mVideoHeight = 0; mIsVideoReadyToBePlayed = false; //mIsVideoSizeKnown = false; } private void startVideoPlayback() { Log.v(TAG, "startVideoPlayback"); holder.setFixedSize(mVideoWidth, mVideoHeight); mMediaPlayer.start(); } 

Ayúdame aquí chicos …

No estoy seguro, pero parece M3U8 archivo no es un archivo multimedia. Es un formato de archivo de lista de reproducción. Esto significa que usted tiene que analizarlo, obtener rutas de los archivos multimedia de él y jugar uno de los archivos que tienes.

Aquí está una breve descripción de cómo se ve el formato http://www.gravlab.com/2013/07/05/what-is-an-m3u8-file/ .

Para aprender a analizar, eche un vistazo a esta respuesta: Analizar el archivo HLS m3u8 utilizando expresiones regulares

  • La aplicación de vista web de Android no permite que el reproductor de video pase a pantalla completa
  • Rtsp rendimiento de vídeo como navegador provocado intención vs mi intención activada por la aplicación
  • Cómo fusionar archivos de audio y video en android
  • Compresión rápida de video en Android
  • Integración de VLC o cualquier otro reproductor de video de terceros en la aplicación para Android
  • Android no puede reproducir vídeo H264 / AAC
  • Android: Jcodec: codificación de archivos de imagen para vídeo .mp4
  • Error de MediaPlayer de Android No se puede reproducir este video
  • Cómo subir un video desde un teléfono Android (como Android) mientras se está grabando
  • Android: dibuja el video de YouTube en SurfaceTexture
  • ¿Reproduce vídeos de vimeo usando el reproductor nativo de android?
  • FlipAndroid es un fan de Google para Android, Todo sobre Android Phones, Android Wear, Android Dev y Aplicaciones para Android Aplicaciones.