Logo Questions Linux Laravel Mysql Ubuntu Git Menu
 

Play a local m3u8 file on android showing setDataSourceFD failed.: status=0x80000000

I am trying to play a local m3u8 file that is stored in my sdcard using android mediaplayer class .The m3u8 file and the .ts files are in the same directory. Third party players like MXPlayer joins the ts files and plays the video when I open the m3u8 from it. But using android mediaplayer class throws the following error`

Unable to to create media player error: setDataSourceFD failed.: status=0x80000000 java.io.IOException: setDataSourceFD failed.: status=0x80000000 at android.media.MediaPlayer.setDataSource(Native Method) at android.media.MediaPlayer.setDataSource(MediaPlayer.java:1204) at com.tcs.hlsvideo.StreamingPlayer.playVideo(StreamingPlayer.java:87) at com.tcs.hlsvideo.StreamingPlayer.surfaceCreated(StreamingPlayer.java:148) at android.view.SurfaceView.updateWindow(SurfaceView.java:609) at android.view.SurfaceView.access$000(SurfaceView.java:86) at android.view.SurfaceView$3.onPreDraw(SurfaceView.java:178) at android.view.ViewTreeObserver.dispatchOnPreDraw(ViewTreeObserver.java:707) at android.view.ViewRootImpl.performTraversals(ViewRootImpl.java:1981) at android.view.ViewRootImpl.doTraversal(ViewRootImpl.java:1143) at android.view.ViewRootImpl$TraversalRunnable.run(ViewRootImpl.java:4667) at android.view.Choreographer$CallbackRecord.run(Choreographer.java:725) at android.view.Choreographer.doCallbacks(Choreographer.java:555) at android.view.Choreographer.doFrame(Choreographer.java:525) at android.view.Choreographer$FrameDisplayEventReceiver.run(Choreographer.java:711) at android.os.Handler.handleCallback(Handler.java:615) at android.os.Handler.dispatchMessage(Handler.java:92) at android.os.Looper.loop(Looper.java:137) at android.app.ActivityThread.main(ActivityThread.java:4960) at java.lang.reflect.Method.invokeNative(Native Method) at java.lang.reflect.Method.invoke(Method.java:511) at com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:1038) at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:805) at dalvik.system.NativeStart.main(Native Method) setDataSourceFD failed.: status=0x80000000

The code that I have used is

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

Help me out here guys... `

like image 777
anz Avatar asked Nov 23 '13 07:11

anz


1 Answers

I'm not sure, but looks like M3U8 file is not a media file. It is a play list file format. It means that you have to parse it, get paths of media files from it and play one of the files you got.

Here is short description how the format looks like http://www.gravlab.com/2013/07/05/what-is-an-m3u8-file/.

To learn how to parse it take a look at this answer: Parsing HLS m3u8 file using regular expressions

like image 61
Dmytro Avatar answered Oct 25 '22 07:10

Dmytro