android - 在 VideoView 上流式传输视频

标签 android video android-videoview

我有一个简单的 VideoView,我正在尝试从 URL 流式传输视频。这是我的代码:

//everything is in onCreate()

videoView = (VideoView)findViewById(R.id.video);

String videoAddress = "https://archive.org/download/ksnn_compilation_master_the_internet/ksnn_compilation_master_the_internet_512kb.mp4";
Uri videoUri = Uri.parse(videoAddress);

videoView.setVideoURI(videoUri);
videoView.start();
videoController = new MediaController(this);
videoController.setAnchorView(videoView);
videoView.setMediaController(videoController);

问题:

开始播放视频需要将近 7-8 秒。一直缓冲到那时。

这与互联网连接无关,因为我在浏览器中在同一互联网上同时播放了相同的视频。 (与应用程序并行运行浏览器)。并且在浏览器中启动视频只需要 1-2 秒。

我也尝试了其他几个来自不同来源的视频,但我都遇到了这种延迟。

类似的问题已在 SO 上被问过多次,但没有得到回答。

最佳答案

问题是,我在 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");

关于android - 在 VideoView 上流式传输视频,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/36055649/

相关文章:

android - ExpandableListView 内的 Edittext 不显示键盘

android - 为什么最新版本的 Stripe gradle 不允许 .setName?

android - 为什么我使用相机传递结果 ResultInfo 失败?

java - 在流式传输 URL 时获取 Android VideoView 收到的数据包的访问权限

java - Facebook 登录 Android SDK ClassNotFoundException : com. facebook.gdp.LightWeightLoginParameters

c# - 如何从具有组件输出的设备获取高清信号并将其显示在 C# 应用程序的窗口中?

ios - AVPlayer seekToTime 方法在 iOS 9 上停止工作

php - 如何将Silverlight Player加载到浏览器中以使用PHP播放视频

Android VideoView - 如何按顺序播放视频

android - 在 android videoView 中选择 youtube 视频质量