为啥 Android 中的 VideoView 需要花费太多时间来加载和播放来自 http 链接的视频?

Posted

技术标签:

【中文标题】为啥 Android 中的 VideoView 需要花费太多时间来加载和播放来自 http 链接的视频?【英文标题】:Why VideoView in android is taking too much time to load and play the video from http link?为什么 Android 中的 VideoView 需要花费太多时间来加载和播放来自 http 链接的视频? 【发布时间】:2014-04-16 04:42:57 【问题描述】:

下面是我的代码:

  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;
    


【问题讨论】:

你试过用不同的 url 播放视频吗? 是的......所有视频都有同样的问题 @Sufian 你对我有什么智慧的话......因为我面临同样的问题。 :P @Kriti 如果不深入了解 Android 框架代码,这是无法修复的。我相信有某种握手造成了延迟。 你有没有找到任何解决方案@Sufian 。因为我挣扎了将近一个星期 【参考方案1】:

看看这个:

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) 


);


谢谢

【讨论】:

您遇到了什么问题?你检查了这个例子。它对我来说很好。 那一定是你的网络连接问题。 重启设备试试看。 @Praksha 你找到解决办法了吗?因为即使我也面临同样的问题。如果您找到了解决方案,请告诉我...... 我认为这不是连接问题。视频播放器在 ios 和 Windows 上的运行速度更快,但 Android 需要更长的时间。 :|【参考方案2】:

不要在 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()方法中,调用这个BackgroundAsynchTaskexecute()方法即可:

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

【讨论】:

废话,你在后台什么也没做。 onProgressUpdate 在 UI 线程上执行。

以上是关于为啥 Android 中的 VideoView 需要花费太多时间来加载和播放来自 http 链接的视频?的主要内容,如果未能解决你的问题,请参考以下文章

android中的VideoView和TextureView和Suraceview有啥区别?

Android中的MediaPlayer和VideoView有啥区别

android java中的圆角videoview

媒体控制器不适用于 Android 中的 VideoView

Android VideoView 中的纵向视频不会占用整个屏幕宽度

即使在 xml 中的固定值之后 VideoView 全屏(Android 2.2)