Безупречный цикл видео с 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 секунды, но был создан без шва, поэтому можно работать без задержек.

Сэм Роули
источник

Ответы:

230

Попробуйте это будет работать на 100%


VideoView videoView;<--- напишите это вне метода или объявите как конечную переменную.

videoView.setOnPreparedListener(new OnPreparedListener() {
    @Override
    public void onPrepared(MediaPlayer mp) {
        mp.setLooping(true);
    }
});
ПравинДодия
источник
Все еще ребуфер для каждого цикла, это не так гладко, как для меня
Pencilcheck
@Pencilcheck - это простой цикл для локального видео, если вы хотите использовать его для URL-адреса и буферизации, тогда вам нужно реализовать другую логику.
PravinDodia 06
К вашему сведению, это не работает и для локальных видео. Если вы воспроизводите видео с постоянным звуком, вы можете слышать паузу между циклами.
Эдисон
1
@PravinDodia Он работает с видео mp4 (файл), но не работает с m3u8. Пожалуйста, предложите мне решение, если у вас есть идеи о файле m3u8.
Мароти
2
@PravinDodia Спасибо за информацию. Да, я использовал потоковое видео. Я использовал vv.start () в MediaPlayer.OnCompletionListener () вместо цикла.
Мароти
7

Не уверен, поможет ли это спустя годы, но я использовал

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

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

и он имеет бесшовную петлю

lexodus k
источник
5

Пауза предназначена для MediaPlayerобновления буферов базового актива . Сколько времени это займет, будет зависеть от ряда факторов, многие из которых находятся вне вашего контроля (например, скорость процессора, скорость встроенной флеш-памяти).

Один из них, которым вы можете управлять, - вывести ваше видео из ресурса в файловую систему. Ресурсы хранятся в APK, который представляет собой ZIP-файл, поэтому извлечение видео таким способом, вероятно, займет дополнительное время.

Возможно, вам придется переключиться VideoViewи использовать SurfaceViewс двумя MediaPlayers, чередуя их - один играет, а следующий готовится, поэтому, когда игра заканчивается, вы можете переключиться на нового игрока. Я не пробовал этого, и поэтому не знаю, какие могут быть последствия. Однако я знаю, что этот метод часто используется для воспроизведения звука для перехода от одного клипа к другому.

CommonsWare
источник
Если я правильно помню, MediaPlayers держатся за SurfaceViews при подготовке, поэтому вы не можете подготовить другой mediaPlayer, пока один его использует.
Эдисон
2

В Котлине просто используйте

videoView.setOnPreparedListener { mp -> mp.isLooping = true }
Чираг Калра
источник
1

Немного поздно, но есть ли причина, по которой вы не можете использовать следующее?

MediaPlayer.setLooping(true);
JJ
источник
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");
                }
            });

Использование краткой формы выражения стрелки

videoView.setOnPreparedListener { mp ->
            //Start Playback
            videoView.start()
            //Loop Video
            mp!!.isLooping = true;
            Log.i(TAG, "Video Started");
        };
Хитеш Саху
источник
0

Ответ на это - удалить звук из видео и преобразовать его в .oggфайл, который можно зациклить, а затем использовать видео без звука для цикла, и это работает.

Сэм Роули
источник