Цикл бесшовного видео с VideoView - PullRequest
75 голосов
/ 20 января 2011

У меня есть следующий код, чтобы взять видео в качестве необработанного ресурса, запустить видео и зациклить его, но мне нужно, чтобы видео без проблем зацикливалось, как сейчас, когда дело доходит до конца клипа и запускает клип снова, переход между вызывает мерцание на долю секунды, что я действительно не могу иметь для моего приложения.

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

Ответы [ 6 ]

200 голосов
/ 08 декабря 2011

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


videoView.setOnPreparedListener(new OnPreparedListener() {
    @Override
    public void onPrepared(MediaPlayer mp) {
        mp.setLooping(true);
    }
});
5 голосов
/ 20 января 2011

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

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

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

4 голосов
/ 07 декабря 2017

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

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

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

и у него есть бесшовная петля

1 голос
/ 18 июля 2011

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

MediaPlayer.setLooping(true);
0 голосов
/ 22 декабря 2014

Вот ответьте друзья, вы должны использовать vv.resume в setOnCompletionListener классе

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

0 голосов
/ 21 января 2011

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

...