Android VideoView按顺序启动大量视频

时间:2017-02-17 23:17:22

标签: android android-videoview

我不间断地测试了这三天。

这是简单的代码:

private VideoView videoView;

-

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

videoView.setOnCompletionListener(new MediaPlayer.OnCompletionListener() {
    @Override
    public void onCompletion(MediaPlayer mediaPlayer) {
            getNewVideo();
        }
    }
});

getNewVideo();

-

private void getNewVideo(){
    File file = //Any File. I have a list of files and they are executed in order
    videoView.stopPlayback();
    videoView.setVideoPath(file.getPath());
    videoView.start();
}

-

<VideoView
    android:id="@+id/videoView"
    android:layout_width="match_parent"
    android:layout_height="match_parent"
    android:layout_alignParentBottom="true"
    android:layout_alignParentLeft="true"
    android:layout_alignParentRight="true"
    android:layout_alignParentTop="true" />

我需要24/7执行此代码。

事情是,与持续时间无关(在开始时,或在运行20分钟后),有时候,视频就会冻结。没有日志,也没有例外,我唯一知道的是在冻结之前运行的最后一件事是onPrepared()。

日志与所有调用视频的尝试相同,唯一的区别是最后一次尝试(冻结的那次),只是在准备完成后停止。

感谢任何提示。

我使用的内部版本号是RKM MK902_ANDROID5.1.1-20151016.1805

使用RKM MK902II Android PC设备,在电视屏幕42中运行

2 个答案:

答案 0 :(得分:5)

我在播放本地视频文件方面没有多少经验(我假设这是因为你的代码说你有&#34;按顺序执行的文件列表&#34;),但是......

根据我的经验,在VideoView正确初始化媒体之前,您不应该致电videoView.start()

当您致电videoView.setVideoPath("path")时,VideoView会执行一些初始化程序来加载媒体。 VideoView加载/初始化媒体后,它将调用其onPreparedListener回调(如果你设置了一个)。只有在VideoView调用此回调时,您才应致电VideoView.start()开始视频播放。

所以...当你在VideoView上设置onCompletionListener时......你还应该设置一个onPreparedListener。当VideoView向您的班级报告已准备好....请致电VideoView.start()开始播放。

videoView.setOnPreparedListener(new MediaPlayer.OnPreparedListener() {
        @Override
        public void onPrepared(MediaPlayer mp) {
            videoView.start();
        }
    }
});

此外,在我的代码中,我在重新使用VideoView播放后续视频之前拨打了VideoView.suspend()。尝试在VideoView.suspend()方法的开头添加对getNewVideo()的调用。

答案 1 :(得分:1)

添加

   videoView.setOnErrorListener(new MediaPlayer.OnErrorListener() {
            @Override
            public boolean onError(MediaPlayer mediaPlayer, int i, int i1) {

                getNewVideo();
                return true;
            }
        });