Loop de vídeo contínuo com VideoView

88

Eu tenho o seguinte código para pegar um vídeo como um recurso bruto, iniciar o vídeo e repeti-lo, mas preciso que o vídeo faça um loop contínuo a partir de agora, quando chega ao final do clipe e começa o clipe novamente, a transição entre causa um piscar por uma fração de segundo, o que eu realmente não posso ter no meu aplicativo.

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();
    }
}

O clipe tem apenas 22 segundos de duração, mas foi criado para ser contínuo, portanto, é possível trabalhar sem atrasos.

SamRowley
fonte

Respostas:

230

Experimente isso vai funcionar 100%


VideoView videoView;<--- escreva fora do método ou então declare como variável final.

videoView.setOnPreparedListener(new OnPreparedListener() {
    @Override
    public void onPrepared(MediaPlayer mp) {
        mp.setLooping(true);
    }
});
PravinDodia
fonte
Ainda refazendo o buffer para cada loop, não é tão suave como o método anterior para mim
Pencilcheck
@Pencilcheck: este é um loop simples para vídeo local; se você quiser usá-lo para url e armazená-lo em buffer, será necessário implementar outra lógica.
PravinDodia
Para sua informação, isso não funciona para vídeos locais também. Se você reproduzir um vídeo com som constante, poderá ouvir a pausa entre os loops.
Edison
1
@PravinDodia Funciona para vídeo mp4 (Arquivo), mas não funciona com m3u8. Por favor me sugira uma solução se você tiver alguma idéia sobre o arquivo m3u8.
Maroti
2
@PravinDodia Obrigado pela informação. Sim, usei stream de vídeo. Usei vv.start () em MediaPlayer.OnCompletionListener () em vez de loop.
Maroti
7

Não tenho certeza se isso ajuda anos depois, mas usei

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

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

e tem um loop contínuo

Lexodus k
fonte
5

A pausa é para que o subjacente MediaPlayeratualize seus buffers. Quanto tempo isso levará dependerá de uma série de fatores, muitos dos quais estão fora de seu controle (por exemplo, velocidade da CPU, velocidade de armazenamento flash on-board).

Um que você pode controlar é tirar o vídeo do recurso e colocá-lo no sistema de arquivos. Os recursos são armazenados no APK, que é um arquivo ZIP, portanto, extrair o vídeo dessa forma provavelmente leva mais tempo.

Você pode precisar alternar VideoViewe usar um SurfaceViewcom dois MediaPlayers, alternando entre eles - um está tocando enquanto o próximo está se preparando, então, quando o jogo terminar, você pode mudar para o novo jogador. Eu não tentei isso e, portanto, não sei quais podem ser as ramificações. No entanto, sei que essa técnica é freqüentemente usada para a reprodução de áudio para fazer a transição de um clipe para outro.

CommonsWare
fonte
Se bem me lembro, os MediaPlayers agarram-se aos SurfaceViews ao se preparar, então você não pode preparar outro mediaPlayer enquanto um estiver usando.
Edison
3

Em Kotlin, basta usar

videoView.setOnPreparedListener { it.isLooping = true }
Chirag Kalra
fonte
1

Um pouco tarde, mas há algum motivo para você não poder usar o seguinte?

MediaPlayer.setLooping(true);
JJ
fonte
1
Isso foi há muito tempo, mas com isso eu acho que houve uma pausa perceptível no vídeo quando o loop around foi chamado.
SamRowley
1

Se você estiver usando 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");
                }
            });

Usando a forma abreviada de expressão de seta

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

A resposta a isso é remover o áudio do vídeo e convertê-lo em um .oggarquivo que pode ser repetido sem problemas e, em seguida, usar o vídeo sem áudio para fazer um loop e isso funciona.

SamRowley
fonte