我有一个带有VideoView的应用程序,可以反复循环播放相同的视频,直到用户对设备执行某些操作(触摸屏等)。目前我正在使用OnCompletionListener()在视频结束时重新启动视频。除了Samsung Replenish之外,这在我测试的每台设备上都能正常工作。
这是我的代码:
mVideoView.setOnCompletionListener(new MediaPlayer.OnCompletionListener() {
public void onCompletion(MediaPlayer mp) {
mVideoView.setVideoPath(file.getAbsolutePath());
mVideoView.start();
}
});
Replenish上发生的事情是视频一直播放一次,但之后再也没有开始,屏幕全黑(但背光仍然打开)。在我使用完全相同的代码进行测试的每一台设备上,它都重复了视频。有没有人知道有关可能导致此错误的补充的任何具体信息?我想可能会延迟对setVideoPath()的调用,而start()200-300ms可能对它有所帮助,但这没有任何影响。我真的很茫然。
我在日志中看到这些消息:
ERROR / QCvdec(87):当vdec尚未初始化时发出Omx Flush。
错误/ QCvdec(87):OMXCORE-SM:收到命令DISABLE(2)
ERROR / QCvdec(87):当vdec尚未初始化时发出Omx Flush。
错误/ QCvdec(87):OMXCORE-SM:接收命令ENABLE(3)
但是这些日志在视频开始时(第一次播放时)和无法重新开始时都会发生。所以我不确定它们是否与我的问题有关
编辑:
我只是尝试将mVideoView设置为null,然后在setVideoPath()之前使用findViewById()获取对它的新引用。我知道这会使OnCompletionListener的设置方式复杂化。但不管怎么说它无论如何都不起作用,仍然是同样的黑屏。
编辑2:
我开始注意到有时视频甚至没有第一次启动。我正在使用这两条线来第一次启动它:
mVideoView.setVideoPath(file.getAbsolutePath());
mVideoView.start();
它似乎开始更加一致,但在它第一次播放时却不是100%。
编辑3:这就是我现在设置它的方式。我手动设置OnPreparedListener为我启动视频。所以我把它添加到我的onCreate()
mVideoView.setOnPreparedListener(new MediaPlayer.OnPreparedListener() {
@Override
public void onPrepared(MediaPlayer arg0) {
mVideoView.start();
}
});
然后,当我准备重新启动视频时,我只调用setVideoPath()方法,如下所示:
mVideoView.setOnCompletionListener(new MediaPlayer.OnCompletionListener() {
public void onCompletion(MediaPlayer mp) {
mVideoView.setVideoPath(file.getAbsolutePath());
}
});
这似乎正在伎俩。我让它运行一段时间才能确定。
编辑4:
@MByD在VideoView的代码中,setVideoPath()是setVideoUri()的包装器。 setVideoURI()正在设置mStartWhenPrepared = false;
默认的OnPreparedListener检查此开关以决定是否开始播放。这就是它不以默认侦听器开头的原因。我没有比这更多地研究它,但是可能有一个setter方法允许我将mStartWhenPrepared值更改为true,这将导致视频从默认侦听器启动。
答案 0 :(得分:3)
在致电.start()之前,您是否曾尝试准备()视频?
来自文档:http://developer.android.com/reference/android/media/MediaPlayer.html#prepare%28%29
使用OnPreparedListener,您可以在准备好后开始播放视频。