Android: MediaPlayer lückenloses oder nahtloses Abspielen von Videos

Ich kann die Videos gut hintereinander abspielen, indem ich das OnCompletionListener, um die Datenquelle auf eine andere Datei festzulegen. Keine Probleme da. Ich rufereset () undbereiten( Alles gut

Was ich nicht herausfinden konnte, ist, wie ich das Bildschirmflimmern mit einer Lücke von 1 bis 2 Sekunden zwischen dem Wechsel der Datenquelle und dem Starten des neuen Videos beseitigen kann. Die Lücke zeigt einen schwarzen Bildschirm, und ich habe keine Möglichkeit gefunden, sie zu umgehen.

Ich habe versucht, den Hintergrund der übergeordneten Ansicht auf ein Bild einzustellen, aber es kann dies umgehen. Auch wenn das SurfaceView ist transparent (was standardmäßig so ist). Ich habe auch versucht, mehrere Videodateien gleichzeitig abzuspielen und die Anzeige des Mediaplayers zu wechseln, wenn eine endet und die andere beginnen soll.

Das letzte, was ich versucht habe, war, eine zweite Ansicht im Hintergrund zu haben, die ich vorübergehend zeige, während das Video "vorbereitet" ist, und sie zu entfernen, wenn das Video startbereit ist. Das war auch nicht sehr nahtlos.

ibt es eine Möglichkeit, diese Lücke zu schließen? Das Abspielen eines Videos in einer Schleife funktioniert wunderbar und macht genau das, was ich will, mit der Ausnahme, dass es dasselbe Video durchschaut, anstatt ein anderes, das ich auswähle, abzuspielen.

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

Antworten auf die Frage(14)

Ihre Antwort auf die Frage