我不间断地测试了这三天。
这是简单的代码:
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中运行
答案 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;
}
});