Android: MediaPlayer Воспроизведение видео без зазоров или без швов

Я могу воспроизводить видео прекрасно, применяяOnCompletionListener установить источник данных в другой файл. Там нет проблем. Я звонюсброс() а такжеподготовить() просто хорошо.

Чего я не смог понять, так это как избавиться от мерцания экрана с промежутком в 1-2 секунды между сменой источника данных и началом нового видео. Разрыв показывает черный экран, и я не нашел способа обойти его.

Я попытался установить фон родительского представления для изображения, но ему удается обойти это. Даже еслиSurfaceView прозрачный (что по умолчанию.) Я также пытался воспроизвести несколько видеофайлов одновременно и переключать отображение медиаплеера, когда один из них заканчивается, а другой должен запуститься.

Последнее, что я попытался, - это иметь второй вид на заднем плане, который я показываю временно, пока видео «готовится», и удаляю его, когда видео готово к запуску. Это также не было очень легко.

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

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

Ответы на вопрос(7)

Ваш ответ на вопрос