Logo Questions Linux Laravel Mysql Ubuntu Git Menu
 

How can i play a video in chunks of bytes?

I want to play a video in android,which i had saved in my assets folder. I have changed it into a byte array and it is playing successfully,using the below code

private String getDataSource() throws IOException {

    InputStream stream = getAssets().open("famous.3gp");

              if (stream == null)
        throw new RuntimeException("stream is null");

                File temp = File.createTempFile("test", "mp4");

       temp.deleteOnExit();

               String tempPath = temp.getAbsolutePath();

    int totalRead = 0;
    int bytesToRead = 1 * 1024;
    FileOutputStream out = new FileOutputStream(temp);
    byte buf[] = new byte[128];
    int numread = 0;

            do {
        numread = stream.read(buf);
        totalRead += numread;
        if (numread <= 0)
            break;
        out.write(buf, 0, numread);
    } while (totalRead<bytesToRead);

        try {
        stream.close();
      } catch (IOException ex) {
        Log.e("mini", "error: " + ex.getMessage(), ex);
      }

        return tempPath;

         // }

     }

and in oncreate

 videoView.setVideoPath(getDataSource());

But my requirement is, i want to play like, first 100 bytes from the array, and when it is finished ,play next 100 bytes in sequence and then another 100 like this.

like image 846
Meenal Avatar asked Feb 04 '14 06:02

Meenal


1 Answers

I got the solution

public class VideoDemo extends Activity {

private MediaController ctlr;


VideoView videoView = null;

Context context = null;
long totalRead = 0;
int bytesToRead = 50 * 1024;

private int mPlayerPosition;
private File mBufferFile;

@Override
public void onCreate(Bundle icicle) {
    super.onCreate(icicle);
    getWindow().setFormat(PixelFormat.TRANSLUCENT);
    setContentView(R.layout.main);




    videoView = (VideoView) findViewById(R.id.videoview);


    ctlr = new MediaController(this);

    ctlr.setMediaPlayer(videoView);
    videoView.setMediaController(ctlr);
    videoView.requestFocus();

    new GetYoutubeFile().start();


}



private class GetYoutubeFile extends Thread {
    private String mUrl;
    private String mFile;

    public GetYoutubeFile() {

    }

    @Override
    public void run() {
        super.run();
        try {

            File bufferingDir = new File(
                    Environment.getExternalStorageDirectory()
                            + "/YoutubeBuff");
            InputStream stream = getAssets().open("famous.3gp");
            if (stream == null)
                throw new RuntimeException("stream is null");
            File temp = File.createTempFile("test", "mp4");
            System.out.println("hi");
            temp.deleteOnExit();
            String tempPath = temp.getAbsolutePath();

            File bufferFile = File.createTempFile("test", "mp4");

            BufferedOutputStream bufferOS = new BufferedOutputStream(
                    new FileOutputStream(bufferFile));


            InputStream is = getAssets().open("famous.3gp");
            BufferedInputStream bis = new BufferedInputStream(is, 2048);

            byte[] buffer = new byte[16384];
            int numRead;
            boolean started = false;
            while ((numRead = bis.read(buffer)) != -1) {

                bufferOS.write(buffer, 0, numRead);
                bufferOS.flush();
                totalRead += numRead;
                if (totalRead > 120000 && !started) {
                    Log.e("Player", "BufferHIT:StartPlay");
                    setSourceAndStartPlay(bufferFile);
                    started = true;
                }

            }
            mBufferFile = bufferFile;

        } catch (MalformedURLException e) {
            e.printStackTrace();
        } catch (IOException e) {
            e.printStackTrace();
        }
    }
}

public void setSourceAndStartPlay(File bufferFile) {
    try {

        mPlayerPosition=videoView.getCurrentPosition();
        videoView.setVideoPath(bufferFile.getAbsolutePath());

        videoView.start();

    } catch (IllegalArgumentException e) {
        e.printStackTrace();
    } catch (IllegalStateException e) {
        e.printStackTrace();
    } catch (Exception e) {
        e.printStackTrace();
    }
}

public void onCompletion(MediaPlayer mp) {
    mPlayerPosition = mp.getCurrentPosition();
    try {
        mp.reset();
        videoView.setVideoPath(new File("mnt/sdcard/YoutubeBuff/"
                + mBufferFile).getAbsolutePath());
        mp.seekTo(mPlayerPosition);
        videoView.start();
    } catch (IllegalArgumentException e) {
        e.printStackTrace();
    } catch (IllegalStateException e) {
        e.printStackTrace();
    } catch (Exception e) {
        e.printStackTrace();
    }

}

and in my xml i had only videoview

like image 85
Meenal Avatar answered Oct 04 '22 16:10

Meenal