title: Play m3u8 video in android
body: <p>I want to live streaming the video and it is in m3u8 format. So i tried the below code</p>
  
  <pre><code>public class StreamingPlayer extends Activity implements
  OnBufferingUpdateListener, OnCompletionListener,
  OnPreparedListener, OnVideoSizeChangedListener, SurfaceHolder.Callback{
  
      private static final String TAG = StreamingPlayer.class.getSimpleName();
      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) {
          // TODO Auto-generated method stub
          super.onCreate(savedInstanceState);
          setContentView(R.layout.mediaplayer_2);
          mPreview = (SurfaceView) findViewById(R.id.surface);
          holder = mPreview.getHolder();
          holder.addCallback(this);
          holder.setType(SurfaceHolder.SURFACE_TYPE_PUSH_BUFFERS);
      }
  
      private void playVideo() {
          doCleanUp();
          try {
  
              /*
               * TODO: Set path variable to progressive streamable mp4 or
               * 3gpp format URL. Http protocol should be used.
               * Mediaplayer can only play "progressive streamable
               * contents" which basically means: 1. the movie atom has to
               * precede all the media data atoms. 2. The clip has to be
               * reasonably interleaved.
               * 
               */
  
              path = "httplive://xboodangx.api.channel.livestream.com/3.0/playlist.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.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);
          }
      }
  
      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;
          if (mIsVideoReadyToBePlayed &amp;&amp; mIsVideoSizeKnown) {
              startVideoPlayback();
          }
      }
  
      public void onPrepared(MediaPlayer mediaplayer) {
          Log.d(TAG, "onPrepared called");
          mIsVideoReadyToBePlayed = true;
          if (mIsVideoReadyToBePlayed &amp;&amp; mIsVideoSizeKnown) {
              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();
      }
  
  
  }
  </code></pre>
  
  <p>In logcat it shows <code>onBufferingUpdate percent:100</code> But i can't see the video.</p>
  
  <p>Audio is working but suddenly it was struck. </p>
  
  <p>And i tried this video link <a href="http://devimages.apple.com/iphone/samples/bipbop/gear1/prog_index.m3u8" rel="nofollow noreferrer">http://devimages.apple.com/iphone/samples/bipbop/gear1/prog_index.m3u8</a> it is working. But my video link is not working and i changed <code>httplive://... instead of http://</code> but no use.</p>
  
  <p>And i saw this answer also <a href="https://stackoverflow.com/questions/7063898/android-video-stream-mms-and-m3u8/7064869#7064869">Android video stream mms and m3u8</a>.</p>
  
  <p>In above link it shows The video cannot be played message.</p>