Posso riprodurre i video con precisione back to back implementando OnCompletionListener per impostare l'origine dati su un file diverso. Nessun problema lì. Chiamo reset() e prepare() bene.Android: MediaPlayer senza pause o senza interruzioni Riproduzione video
Quello che non sono stato in grado di capire, è come sbarazzarsi dello sfarfallio dello schermo gap di 1-2 secondi tra la modifica della sorgente dati e l'avvio del nuovo video. Il divario mostra uno schermo nero e non ho trovato alcun modo per aggirarlo.
Ho provato a impostare lo sfondo della vista genitore su un'immagine, ma riesce a ignorarlo. Anche se il SurfaceView è trasparente (che è l'impostazione predefinita). Ho anche provato a far riprodurre contemporaneamente più file video allo stesso tempo e a cambiare il display del mediaplayer quando uno finisce e l'altro dovrebbe iniziare.
L'ultima cosa che ho provato, era avere una seconda vista sullo sfondo che mostro temporaneamente mentre il video si sta "preparando" e rimuovendolo quando il video è pronto per essere avviato. Anche questo non era molto semplice.
C'è un modo per sbarazzarsi di tale lacuna. L'esecuzione di un video in loop funziona perfettamente e fa esattamente ciò che voglio, con l'eccezione che sta guardando attraverso lo stesso video invece di riprodurne uno diverso.
main.xml
<?xml version="1.0" encoding="utf-8"?>
<FrameLayout xmlns:android="http://schemas.android.com/apk/res/android"
android:layout_width="fill_parent"
android:background="@drawable/background"
android:layout_height="fill_parent">
<SurfaceView
android:id="@+id/surface"
android:layout_width="fill_parent"
android:layout_height="fill_parent"
android:layout_gravity="center">
</SurfaceView>
</FrameLayout>
Player.java
public class Player extends Activity implements
OnCompletionListener, MediaPlayer.OnPreparedListener, SurfaceHolder.Callback {
private MediaPlayer player;
private SurfaceView surface;
private SurfaceHolder holder;
public void onCreate(Bundle b) {
super.onCreate(b);
setContentView(R.layout.main);
surface = (SurfaceView)findViewById(R.id.surface);
holder = surface.getHolder();
holder.addCallback(this);
holder.setType(SurfaceHolder.SURFACE_TYPE_PUSH_BUFFERS);
}
public void onCompletion(MediaPlayer arg0) {
File clip = new File(Environment.getExternalStorageDirectory(),"file2.mp4");
playVideo(clip.getAbsolutePath());
}
public void onPrepared(MediaPlayer mediaplayer) {
holder.setFixedSize(player.getVideoWidth(), player.getVideoHeight());
player.start();
}
private void playVideo(String url) {
try {
File clip = new File(Environment.getExternalStorageDirectory(),"file1.mp4");
if (player == null) {
player = new MediaPlayer();
player.setScreenOnWhilePlaying(true);
}
else {
player.stop();
player.reset();
}
player.setDataSource(url);
player.setDisplay(holder);
player.setOnPreparedListener(this);
player.prepare();
player.setOnCompletionListener(this);
}
catch (Throwable t) {
Log.e("ERROR", "Exception Error", t);
}
}
Anche se questo è stato pubblicato qualche tempo fa, sto affrontando lo stesso problema. Anche con l'utilizzo di videoview, ho ancora una lacuna quando si passa da un video all'altro. C'è un altro modo per risolvere questo? – dulys