2014-03-12 40 views
8

下面是我的代码:为什么在android中VideoView需要花费太多时间从http链接加载和播放视频?

package com.example.videoplayer; 
    import android.app.Activity; 
    import android.app.ProgressDialog; 
    import android.media.MediaPlayer; 
    import android.os.Bundle; 
    import android.util.Log; 
    import android.view.Menu; 
    import android.widget.MediaController; 
    import android.widget.VideoView; 

public class VideoPlayerActivity extends Activity { 
    String TAG = "com.example.VideoPlayer"; 
    ProgressDialog progDailog; 
    @Override 
    protected void onCreate(Bundle savedInstanceState) { 
     super.onCreate(savedInstanceState); 
     setContentView(R.layout.activity_video_player); 

     final VideoView videoView = (VideoView) findViewById(R.id.videoView1); 
     videoView.setVideoPath("http://www.ebookfrenzy.com/android_book/movie.mp4"); 

     MediaController mediaController = new MediaController(this); 
     mediaController.setAnchorView(videoView); 
     videoView.setMediaController(mediaController); 

     videoView.setOnPreparedListener(new 
       MediaPlayer.OnPreparedListener() { 
      @Override 
      public void onPrepared(MediaPlayer mp) { 
       progDailog.dismiss(); 
       Log.i(TAG, "Duration = " + videoView.getDuration()); 
      } 
     }); 

     videoView.start(); 
     progDailog = ProgressDialog.show(this, "Please wait ...", "Retrieving data ...", `enter code here`true); 

    } 

    @Override 
    public boolean onCreateOptionsMenu(Menu menu) { 
     // Inflate the menu; this adds items to the action bar if it is present. 
     getMenuInflater().inflate(R.menu.video_player, menu); 
     return true; 
    } 

} 
+0

你尝试扮演不同的网址视频? –

+0

是的...所有视频的问题相同 – Praksha

+0

请在下面查看我的答案,它适用于我。如果您发现任何问题,请告诉我。 –

回答

0

看看这个:

Play http videos in VideoView

这是我的代码:

public static void getVideoFromHttp(String urlPath) { 

try { 
// Start the MediaController 
MediaController mediacontroller = new MediaController(mContext); 
mediacontroller.setAnchorView(mVideoview); 
// Get the URL from String VideoURL 
Uri mVideo = Uri.parse(urlPath); 
mVideoview.setMediaController(mediacontroller); 
mVideoview.setVideoURI(mVideo); 

} catch (Exception e) { 
Log.e("Error", e.getMessage()); 
e.printStackTrace(); 

} 

mVideoview.requestFocus(); 
mVideoview.setOnPreparedListener(new OnPreparedListener() { 
// Close the progress bar and play the video 
public void onPrepared(MediaPlayer mp) { 
    mVideoview.start(); 

} 
}); 

mVideoview.setOnCompletionListener(new OnCompletionListener() { 

public void onCompletion(MediaPlayer mp) { 

} 
}); 

} 

感谢

+0

没有用过同样的问题..... – Praksha

+0

你面临什么问题?你检查过这个例子吗?这对我来说可以。 –

+0

它工作正常,但需要太多的时间来加载视频... – Praksha

-1

不要做的一切UI线程,因为它需要很多时间即尽一切在AsyncTask和事情会工作得很好。

对于初学者,this link介绍了如何在AsyncTask中执行此操作。

定义扩展了AsyncTask类:

public class BackgroundAsyncTask extends AsyncTask<String, Uri, Void> { 
    Integer track = 0; 
    ProgressDialog dialog; 

    protected void onPreExecute() { 
     dialog = new ProgressDialog(PlayVideo.this); 
     dialog.setMessage("Loading, Please Wait..."); 
     dialog.setCancelable(true); 
     dialog.show(); 
    } 

    protected void onProgressUpdate(final Uri... uri) { 

     try { 

      media=new MediaController(PlayVideo.this); 
      video.setMediaController(media); 
      media.setPrevNextListeners(new View.OnClickListener() { 
       @Override 
       public void onClick(View v) { 
        // next button clicked 

       } 
      }, new View.OnClickListener() { 
       @Override 
       public void onClick(View v) { 

        finish(); 
       } 
      }); 
      media.show(10000); 

      video.setVideoURI(uri[0]); 
      video.requestFocus(); 
      video.setOnPreparedListener(new OnPreparedListener() { 

       public void onPrepared(MediaPlayer arg0) { 
        video.start(); 
        dialog.dismiss(); 
       } 
      }); 


     } catch (IllegalArgumentException e) { 
      e.printStackTrace(); 
     } catch (IllegalStateException e) { 
      e.printStackTrace(); 
     } catch (SecurityException e) { 
      // TODO Auto-generated catch block 
      e.printStackTrace(); 
     } 


    } 

    @Override 
    protected Void doInBackground(String... params) { 
     try { 
      Uri uri = Uri.parse(params[0]); 

      publishProgress(uri); 
     } catch (Exception e) { 
      e.printStackTrace(); 

     } 

     return null; 
    } 

} 

然后,在onCreate()方法,只需拨打这个BackgroundAsynchTask的​​方法:

video = (VideoView) findViewById(R.id.video); 
new BackgroundAsyncTask().execute("link-to-the-video"); 
+0

废话,你在背景上什么都不做。 'onProgressUpdate'在UI线程上执行。 – htafoya

相关问题