带有VideoView的无缝视频循环


88

我有以下代码将视频作为原始资源,启动视频并将其循环播放,但是从片段的结尾到现在,我需要视频才能无缝循环,然后再次开始播放片段,导致瞬间闪烁,我的应用程序确实无法做到这一点。

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秒长,但是被创建为无缝的,因此可以毫无延迟地工作。

Answers:


229

试试这个,它将100%工作


VideoView videoView;<-将其写入方法之外,或者将其声明为最终变量。

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

仍然需要为每个循环重新缓冲,这对我来说并不像以前的方法那么顺利
Pencilcheck

@Pencilcheck这是本地视频的简单循环,如果要使用它作为url并对其进行缓冲,则必须实现其他逻辑。
PravinDodia 2014年

仅供参考,这也不适用于本地视频。如果您以恒定的声音播放视频,则可以听到循环之间的暂停。
爱迪生

1
@PravinDodia它适用于mp4视频(文件),但不适用于m3u8。如果您对m3u8文件有任何想法,请给我建议解决方案。
Maroti 2015年

2
@PravinDodia感谢您的信息。是的,我使用了流视频。我在MediaPlayer.OnCompletionListener()中使用了vv.start()而不是循环。
Maroti 2015年

7

不确定几年后是否有帮助,但是我使用了

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

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

它有一个无缝循环


5

暂停是针对底层的 MediaPlayer刷新其缓冲区。所需的时间取决于许多因素,其中许多是您无法控制的(例如,CPU速度,板载闪存的速度)。

您可以控制的一种方法是将视频移出资源并进入文件系统。资源存储在APK(ZIP文件)中,因此以这种方式提取视频可能会花费额外的时间。

您可能需要离开VideoViewSurfaceView在两个MediaPlayers之间交替使用a-一个正在玩而另一个正在准备中,因此当一个播放结束时,您可以切换到新播放器。我没有尝试过,所以我不知道可能会有什么后果。但是,我知道该技术经常用于音频播放,以从一个剪辑过渡到另一个剪辑。


如果我没记错的话,MediaPlayers在准备时会坚持使用surfaceViews,因此您不能在使用另一个mediaPlayer的同时准备它。
爱迪生


1

来晚了,但是有什么原因您不能使用以下内容?

MediaPlayer.setLooping(true);

1
这是很久以前的事了,但是我认为在调用循环时视频中出现了明显的停顿。
SamRowley

1

如果您使用的是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");
                }
            });

使用Arrow Expression简短格式

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

0

对此的答案是从视频中删除音频并将其转换为.ogg可以无缝循环的文件,然后使用不带音频的视频进行循环播放,这是可行的。


By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.