2011-08-10 74 views
5

我有一个VideoView应用程序,它会一直循环播放相同的视频,直到用户对设备执行某些操作(触摸屏等)当前我正在使用OnCompletionListener()来重新启动视频一旦结束。这适用于我测试过的每个设备,除了三星补货。VideoView循环视频补充

这里是我的代码:

mVideoView.setOnCompletionListener(new MediaPlayer.OnCompletionListener() { 
     public void onCompletion(MediaPlayer mp) { 
      mVideoView.setVideoPath(file.getAbsolutePath()); 
      mVideoView.start(); 
     } 
    }); 

在补货,会发生什么是视频播放一路走过一次,但然后永远不会再次启动,屏幕会全黑(但背光仍然打开)。在我使用完全相同的代码测试过的每个其他设备上,它都能够重复播放视频。有谁知道任何具体的补充可能会导致此错误?我想可能延迟了setVideoPath()的调用,并且启动()200到300ms可能会有所帮助,但这没有任何影响。我在这里真的很茫然。

我看到在我记录这些消息:

ERROR/QCvdec(87):OMX冲洗时VDEC尚未初始化发出。

ERROR/QCvdec(87):OMXCORE-SM:收到命令DISABLE(2)

ERROR/QCvdec(87):OMX冲洗时VDEC尚未初始化发出。

ERROR/QCvdec(87):OMXCORE-SM:收到命令ENABLE(3)

但是,这些日志发生既当视频开始(第一次它起着),并且当无法启动再次。所以我不知道,如果他们都跟我的问题

编辑:

我只是试图设置mVideoView为空,然后setVideoPath前右侧获得一个新的参考其与findViewById()()。我知道这会使OnCompletionListener的设置复杂化。但无论如何它仍然无法工作,仍然是同一个黑屏。

编辑2:

我开始注意到,有时视频甚至不启动的第一次。我使用这些相同的两行启动它的第一次:

 mVideoView.setVideoPath(file.getAbsolutePath()); 
     mVideoView.start(); 

它似乎更consistantly开始,但其第一次被播放时不太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

有趣的问题。 – PedroAGSantos

回答

3

在调用.start()之前,您是否尝试准备()您的视频?

从文档:http://developer.android.com/reference/android/media/MediaPlayer.html#prepare%28%29

OnPreparedListener你可以当它准备开始你的视频。

+0

使用VideoView时无需调用准备。 – MByD

+0

准备是MediaPlayer的一种方法,而不是VideoView。我假设VideoView正在调用其底层MediaPlayer上的prepare,作为setVideoPath()方法的一部分。准备好的听众可能是我需要的。我现在可以用它来测试它,它似乎会变得更好。如果一切顺利,你将得到正确的答案。谢谢 – FoamyGuy