Я могу воспроизводить видео очень хорошо, реализуя OnCompletionListener, чтобы установить источник данных в другой файл. Проблем нет. Я вызываю reset() и готовлю() просто отлично.
То, что я не смог выяснить, заключается в том, как избавиться от мерцания экрана на 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);
}
}