使用VideoView的无缝视频循环

时间:2011-01-20 10:40:07

标签: android android-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秒长,但是创建时是无缝的,所以可以毫不拖延地工作。

8 个答案:

答案 0 :(得分:198)

尝试这样可以100%


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

答案 1 :(得分:5)

暂停是基础MediaPlayer刷新其缓冲区。需要多长时间取决于许多因素,其中许多因素都超出了您的控制范围(例如,CPU的速度,板载闪存的速度)。

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

您可能需要切换VideoView并使用SurfaceViewMediaPlayers两个{{1}},在它们之间交替进行 - 一个正在准备,而下一个正在准备,所以当播放时结束你可以切换到新的播放器。我没试过这个,所以我不知道会有什么后果。但是,我知道这种技术经常用于音频播放,以便从一个剪辑转换到另一个剪辑。

答案 2 :(得分:4)

不确定这会在几年后有所帮助,但我使用了

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

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

它有一个无缝循环

答案 3 :(得分:3)

在Kotlin中只需使用

videoView.setOnPreparedListener { it.isLooping = true }

答案 4 :(得分:1)

迟到了,但是你有什么理由不能使用以下内容?

MediaPlayer.setLooping(true);

答案 5 :(得分: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");
                }
            });

使用箭头表达式简短格式

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

答案 6 :(得分:0)

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

答案 7 :(得分:0)

以下是回答朋友的问题,您必须在vv.resume班级

中使用setOnCompletionListener

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