如何根据android中的缓冲区%年龄从网址视频视频中播放视频?

时间:2015-06-10 07:17:51

标签: android video mediacontroller

我有来自s3服务器的视频链接,我正在VideoView上播放此视频。视频播放正常,但问题是首先下载整个视频然后播放。

我希望它像缓冲区一样播放。我的意思是如果20%的视频下载它应该播放那些,然后再次下载(如在youtube中)。这是我的代码我所做的是..

 FFmpegMediaMetadataRetriever mediaMetadataRetriever = new FFmpegMediaMetadataRetriever();
      AWSCredentials myCredentials = new BasicAWSCredentials(
        "AKIAIGOIY4LLB7EMACGQ",
        "7wNQeY1JC0uyMaGYhKBKc9V7QC7X4ecBtyLimt2l");
      AmazonS3 s3client = new AmazonS3Client(myCredentials);
      GeneratePresignedUrlRequest request = new GeneratePresignedUrlRequest(
        "mgvtest", videoUrl);
      URL objectURL = s3client.generatePresignedUrl(request);

      try {
       mediaMetadataRetriever.setDataSource(videoUrl);
      } catch (Exception e) {
       utilDialog.showDialog("Unable to load this video",
         utilDialog.ALERT_DIALOG);
       pb.setVisibility(View.INVISIBLE);
      }

      videoView.setVideoURI(Uri.parse(videoUrl));
     MediaController myMediaController = new MediaController(this);
      // myMediaController.setMediaPlayer(videoView);
      videoView.setMediaController(myMediaController);

      videoView.setOnCompletionListener(myVideoViewCompletionListener);
      videoView.setOnPreparedListener(MyVideoViewPreparedListener);
      videoView.setOnErrorListener(myVideoViewErrorListener);

      videoView.requestFocus();
      videoView.start();

监听

MediaPlayer.OnCompletionListener myVideoViewCompletionListener = new MediaPlayer.OnCompletionListener() {

  @Override
  public void onCompletion(MediaPlayer arg0) {
   // Toast.makeText(PlayRecordedVideoActivity.this, "End of Video",
   // Toast.LENGTH_LONG).show();
  }
 };

 MediaPlayer.OnPreparedListener MyVideoViewPreparedListener = new MediaPlayer.OnPreparedListener() {

  @Override
  public void onPrepared(MediaPlayer mp) {
   pb.setVisibility(View.INVISIBLE);
   imgScreenshot.setVisibility(View.VISIBLE);
   tvScreenshot.setVisibility(View.VISIBLE);

   // final Animation in = new AlphaAnimation(0.0f, 1.0f);
   // in.setDuration(3000);
   // tvScreenshot.startAnimation(in);

   Animation animation = AnimationUtils.loadAnimation(
     getApplicationContext(), R.anim.zoom_in);
   tvScreenshot.startAnimation(animation);

   new Handler().postDelayed(new Runnable() {

    @Override
    public void run() {
     tvScreenshot.setVisibility(View.INVISIBLE);
    }
   }, 3000);
  }
 };

 MediaPlayer.OnErrorListener myVideoViewErrorListener = new MediaPlayer.OnErrorListener() {

  @Override
  public boolean onError(MediaPlayer mp, int what, int extra) {

   // Toast.makeText(PlayRecordedVideoActivity.this, "Error!!!",
   // Toast.LENGTH_LONG).show();
   return true;
  }
 };

2 个答案:

答案 0 :(得分:0)

实际上你必须用s3启动cloudfront,所以可以流式传输s3视频, 查看此链接以获取更多信息: http://www.miracletutorials.com/s3-streaming-video-with-cloudfront/

答案 1 :(得分:0)

为了能够在完全下载视频之前开始播放mp4视频,必须在视频开头而不是结束时使用元数据 - 不幸的是,使用标准mp4默认情况下通常会将其放在最后

元数据位于'原子中。或者'框' (基本上是mp4文件中的数据结构)并且可以移动到开头。这通常被称为快速启动,而诸如ffmpeg之类的工具将允许您这样做。以下是ffmpeg文档的摘录:

  

mov / mp4 / ismv复用器支持碎片。通常,MOV / MP4文件包含存储在一个位置的所有数据包的所有元数据(写在文件的末尾,可以通过向movflags添加faststart或使用qt-faststart将其移动到开头以便更好地播放工具)。

还有其他工具和软件可以让你这样做 - 例如在上面的ffmpeg摘录中提到的那个:

如果你真的想要完整的流媒体服务器将文件分成块并且这些是由客户端逐个下载的,那么你可能想要使用一种自适应比特率协议(Apple' HLS,MS& #39;平滑流,Adobe自适应流媒体或新的开放标准DASH)。这也允许您具有不同的比特率以允许不同的网络条件。您将需要一个可以支持此功能的服务器来使用这些技术。如果您只想要一个包含单个视频的简单网站并且不会有太多流量,那么这可能会有点过分。