2011-01-20 19 views
60

Ho il seguente codice per prendere un video come risorsa non elaborata, avviare il video e collegarlo in loop ma ho bisogno che il video esegua il loop senza interruzioni da ora quando si arriva alla fine della clip e inizia la clip di nuovo la transizione tra provoca uno sfarfallio per una frazione di secondo, cosa che davvero non posso avere per la mia app.Loop video senza interruzioni con 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(); 
    } 
} 

la clip è lungo solo 22 secondi, ma è stato creato per essere senza soluzione di continuità, quindi è possibile lavorare senza il ritardo.

risposta

149

Prova questo funzionerà al 100%


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

Ancora rebuffer per ogni ciclo, non è uniforme come il metodo precedente a me – Pencilcheck

+0

@Pencilcheck questo è un semplice loop per il video locale, se si desidera usarlo per l'url e il buffering, allora si deve implementare altra logica. – PravinDodia

+0

FYI a tutti, questo non funziona anche per i video locali. Se riproduci un video con suono costante, puoi sentire la pausa tra i cicli. – Edison

4

La pausa è per il sottostante MediaPlayer per aggiornare i relativi buffer. Il tempo necessario dipende da una serie di fattori, molti dei quali sono fuori dal tuo controllo (ad es. Velocità della CPU, velocità della memoria flash integrata).

Uno che è possibile controllare è di estrarre il video dalla risorsa e nel file system. Le risorse sono memorizzate nell'APK, che è un file ZIP, quindi estrarre il video in questo modo richiede probabilmente più tempo.

Potrebbe essere necessario passare da VideoView e utilizzare un SurfaceView con due MediaPlayers, alternando tra di loro - uno è suonare mentre il prossimo si appresta, in modo che quando la riproduzione di uno finisce si può passare al nuovo giocatore. Non ho provato questo, e quindi non so quali potrebbero essere le ramificazioni. Tuttavia, so che questa tecnica viene spesso utilizzata per la transizione audio da una clip all'altra.

+0

Se non ricordo male, MediaPlayers mantenere il surfaceViews quando ottiene preparati, quindi non è possibile preparare un altro MediaPlayer, mentre si sta usando esso. – Edison

0

Risposta a questo è quello di rimuovere l'audio dal video e convertirlo in un file .ogg che può essere collegato in loop senza soluzione di continuità e quindi utilizzare il video senza audio per eseguire il ciclo rotondo e questo funziona.

1

Poco in ritardo, ma qualche motivo per cui non è possibile utilizzare quanto segue?

MediaPlayer.setLooping(true); 
+1

Questo è stato molto tempo fa, ma credo che ci sia stata una pausa notevole nel video quando è stato chiamato il loop. – SamRowley

1

Non sono sicuro se questo aiuta anni dopo, ma ho usato

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

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

e ha un ciclo continuo

Problemi correlati