Android使用videoView同时下载和播放视频文件

时间:2015-01-29 06:45:04

标签: android

我已经开始下载文件并开始播放该文件。如果文件大小很小(小于15 MB)。源代码下载和完美播放视频。 如果文件大小很大(50 MB或更多),则视频播放开始。对于我的情况,文件大小为50 MB,下载大小为10 MB,并且在下载开始时播放视频视图,一旦播放10 MB大小的视频,它将等待即将到来的字节。下载后,只播放音频。视频帧未获得更新。

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

}

1 个答案:

答案 0 :(得分:1)

@Karthick

您的代码似乎没问题! 只需将OnCompletionListener,OnErrorListener注册到您的VideoView。

 videoView.setOnCompletionListener(this);
 videoView.setOnErrorListener(this);

因此,一旦媒体播放器播放缓冲流,它将进入onCompletion或抛出错误(视频无法播放),这可以通过再次更改搜索位置和播放相同的缓冲文件来处理。 (请确保视频比特率和传输速率需要相同),因此缓冲和流媒体将同时运行。

方法的实现可能如下所示,

@Override
public boolean onError(MediaPlayer mp, int what, int extra) {
    // TODO Auto-generated method stub
    mPlayerErrorPos = mp.getCurrentPosition();
    mPlayerPosition=mPlayerCompletionPos > mPlayerErrorPos ? mPlayerCompletionPos : mPlayerErrorPos;

    try {
        mp.reset();
        videoView.setVideoPath(video.getAbsolutePath());
        videoView.seekTo(mPlayerPosition);
        videoView.start();
    } catch (IllegalArgumentException e) {
        e.printStackTrace();
    } catch (IllegalStateException e) {
        e.printStackTrace();
    } catch (Exception e) {
        e.printStackTrace();
    }
    return true;
}

@Override
public void onCompletion(MediaPlayer mp) {
    mPlayerCompletionPos = mp.getCurrentPosition();
  }