为啥 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()
方法中,调用这个BackgroundAsynchTask
的execute()
方法即可:
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 中的 VideoView