2011-01-20 94 views
60

我有以下代码将视频作为原始资源,启动视频并循环播放,但我需要视频在截至剪辑结束时以无缝方式循环播放,并启动剪辑再次之间的过渡导致闪烁一瞬间,这是我真的不能为我的应用程序。无缝视频循环与VideoView

public class Example extends Activity { 
    VideoView vv; 
    /** Called when the activity is first created. */ 
    @Override 
    public void onCreate(Bundle savedInstanceState) { 
     super.onCreate(savedInstanceState); 
     setContentView(R.layout.main); 

     vv = (VideoView)findViewById(R.id.VideoView01); 

     //Video Loop 
     vv.setOnCompletionListener(new MediaPlayer.OnCompletionListener() { 
      public void onCompletion(MediaPlayer mp) { 
       vv.start(); //need to make transition seamless. 
      } 
     }); 

     Uri uri = Uri.parse("android.resource://com.example/" 
       + R.raw.video); 

     vv.setVideoURI(uri); 
     vv.requestFocus();  
     vv.start(); 
    } 
} 

该剪辑只有22秒长,但被创建为无缝,因此可以毫不拖延地工作。

回答

149

试试这个它的工作100%


videoView.setOnPreparedListener(new OnPreparedListener() { 
    @Override 
    public void onPrepared(MediaPlayer mp) { 
     mp.setLooping(true); 
    } 
}); 
+0

仍然拒绝每一个循环,它不像以前的方法那样流畅 – Pencilcheck 2013-12-29 21:04:15

4

暂停是为底层MediaPlayer刷新其缓冲区。需要多长时间将取决于许多因素,其中许多因素不在您的控制之下(例如,CPU的速度,机载闪存的速度)。

你可以控制的是让你的视频离开资源进入文件系统。资源存储在APK中,这是一个ZIP文件,因此以这种方式提取视频可能需要额外的时间。

您可能需要从VideoView切换出来,并使用带有两个MediaPlayersSurfaceView,他们之间的交流 - 一个是而未来正准备打的,所以当玩了一结束,你可以切换到新的球员。我没有尝试过,所以我不知道可能会有什么后果。但是,我知道这种技术经常用于音频回放从一个片段转换到另一个片段。

+0

如果我没有记错,MediaPlayers扶住surfaceViews时刻准备的时候,所以当一个人正在使用它,你不能准备另一媒体播放器。 – Edison 2014-03-17 18:18:47

0

对此的解答是从视频中删除音频并将其转换为可以无缝循环的.ogg文件,然后使用没有音频的视频循环播放,并且可以工作。

1

有点晚了,但任何原因,你不能使用以下?

MediaPlayer.setLooping(true); 
+1

这是很久以前的事了,但我认为当周围环绕声被调用时,视频中出现明显的停顿。 – SamRowley 2011-07-18 07:52:53

1

不知道这帮助多年后,但我用

vv.start(); 
vv.setOnCompletionListener (new MediaPlayer.OnCompletionListener() { 

@Override 
    public void onCompletion(MediaPlayer mediaPlayer) { 
    vv.start(); 
    } 
}); 

,它有一个无缝循环