100

我有以下代码将视频作为原始资源,启动视频并循环播放,但我需要视频在剪辑结束时无缝循环并再次开始剪辑之间的过渡导致闪烁一瞬间,我的应用程序真的无法做到这一点。

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 秒长,但它的创建是无缝的,因此可以在没有延迟的情况下工作。

4

8 回答 8

248

试试这个,它会 100% 工作


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

videoView.setOnPreparedListener(new OnPreparedListener() {
    @Override
    public void onPrepared(MediaPlayer mp) {
        mp.setLooping(true);
    }
});
于 2011-12-08T13:00:59.673 回答
10

在 Kotlin 中只需使用

videoView.setOnPreparedListener { it.isLooping = true }
于 2020-08-12T08:42:08.017 回答
9

不知道这在几年后是否有帮助,但我用过

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

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

它有一个无缝循环

于 2017-12-07T10:39:55.393 回答
5

暂停是为了让底层证券MediaPlayer刷新其缓冲区。这需要多长时间取决于许多因素,其中许多是您无法控制的(例如,CPU 的速度、板载闪存的速度)。

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

您可能需要切换VideoView并使用 aSurfaceView和两个MediaPlayers,在它们之间交替使用 - 一个正在播放,而另一个正在准备,因此当播放结束时,您可以切换到新播放器。我还没有尝试过,所以我不知道后果可能是什么。但是,我知道这种技术经常用于音频播放以从一个剪辑过渡到另一个剪辑。

于 2011-01-20T12:45:01.283 回答
2

有点晚了,但是有什么理由不能使用以下内容?

MediaPlayer.setLooping(true);
于 2011-07-17T21:17:48.720 回答
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");
        };
于 2020-04-15T08:34:53.457 回答
0

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

于 2011-01-21T09:56:42.360 回答
0

这是回答的朋友,你必须vv.resumesetOnCompletionListener课堂上使用

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

于 2014-12-22T16:20:44.740 回答