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
- Utilice Video chat en segundo plano como Skype usando WebRTC en Android
- Android: el video se puede reproducir desde la galería pero cuando lo reproduzco usando el video de tipo Intent.ACTION_VIEW, no se puede reproducir
- ¿Cómo evitar que el android invierta la imagen de la cámara frente a frente?
- Android - Integración de ffmpeg y android-ndk-r9c
- Reproducir video local en la vista web
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 …
- Reproducción de un video local de aplicación (.mp4) en una vista web
- Se ha abandonado BufferQueue: Al reproducir vídeo con TextureView
- Los archivos de video locales no se reproducirán en la aplicación para Android de Cordova
- MediaExtractor.setDataSource lanza IOException "no se pudo instanciar el extractor"
- Reproducción de vídeos HTML5 en el navegador - ¿Qué funciona para la mayoría de los dispositivos Android?
- Limitaciones de la captura de video en la brecha del teléfono + complementos nativos
- Inserción de un vídeo en MediaStore
- Live Video Streaming para Android usando Phonegap?
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