基于 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秒长,但被创建为无缝,所以它是可能的工作没有延迟。

69089 次浏览

The pause is for the underlying MediaPlayer to refresh its buffers. How long that will take will depend on a number of factors, many of which are outside your control (e.g., speed of CPU, speed of on-board flash storage).

One you can control is to get your video out of the resource and into the filesystem. Resources are stored in the APK, which is a ZIP file, so extracting the video this way probably takes extra time.

You may need to switch away from VideoView and use a SurfaceView with two MediaPlayers, alternating between them -- one is playing while the next is preparing, so when the playing one ends you can switch to the new player. I have not tried this, and so I do not know what the ramifications might be. However, I know that this technique is frequently used for audio playback to transition from one clip to another.

Answer to this is to remove the audio from the video and convert that to a .ogg file which can be looped seamlessly and then use the video without audio to loop round and this works.

Little late, but any reason that you can't use the following?

MediaPlayer.setLooping(true);

Try this it will work 100%


VideoView videoView;<---write this in outside of method or else declare it as final variable.

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

Here is answer friends, you must use vv.resume in setOnCompletionListener class

[https://stackoverflow.com/a/27606389/3414469][1]

Not sure if this helps years later, but I used

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


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

and it has a seamless loop

If you are using Kotlin

 videoView.setOnPreparedListener(object : MediaPlayer.OnPreparedListener {
override fun onPrepared(mp: MediaPlayer?) {
//Start Playback
videoView.start()
//Loop Video
mp!!.isLooping = true;
Log.i(TAG, "Video Started");
}
});

Using Arrow Expression short form

videoView.setOnPreparedListener { mp ->
//Start Playback
videoView.start()
//Loop Video
mp!!.isLooping = true;
Log.i(TAG, "Video Started");
};

In Kotlin simply use

videoView.setOnPreparedListener { it.isLooping = true }