java - studio - Reproduce un archivo m3u8 local en Android que muestra setDataSourceFD failed.: status=0x80000000
reproductor de video para android codigo fuente (1)
Estoy tratando de reproducir un archivo m3u8 local que está almacenado en mi tarjeta SD usando la clase mediaplayer de android. El archivo m3u8 y los archivos .ts están en el mismo directorio. Los jugadores de terceros como MXPlayer se unen a los archivos ts y reproducen el video cuando abro el m3u8. Pero el uso de la clase mediaplayer de Android arroja el siguiente error`
No se pudo crear el error del reproductor multimedia: setDataSourceFD failed .: 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.Coreographer $ 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.Coreographer $ FrameDisplayEventReceiver.run (Choreographer.java:711) en android.os.Handler.handleCallback (Handler .java: 615) 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 que el archivo M3U8 no es un archivo multimedia. Es un formato de archivo de lista de reproducción. Significa que debes analizarlo, obtener rutas de archivos multimedia y reproducir uno de los archivos que obtuviste.
Aquí hay 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 analizarlo, eche un vistazo a esta respuesta: Análisis del archivo HLS m3u8 con expresiones regulares