我可以通过执行OnCompletionListener来精确地播放视频,以将数据源设置为不同的文件。那里没有问题。我打电话reset()和prepare()就好。Android:MediaPlayer无缝或无缝视频播放
我无法弄清楚的是如何摆脱数据源更改和新视频启动之间的1-2秒间隔屏幕闪烁。差距显示黑屏,我还没有找到任何方法来解决它。
我试着将父视图的背景设置为图像,但它设法绕过。即使SurfaceView是透明的(这是默认情况下)。我也尝试同时播放多个视频文件,并在一个结束时切换mediaplayer的显示,另一个应该开始。
我试过的最后一件事是在视频“准备”时临时显示的背景中显示第二个视图,并在视频准备开始时将其删除。这也不是非常无缝。
有没有什么办法摆脱这种差距。在一个循环中运行一个视频奇妙地工作,并且正是我想要的,除了它正在通过相同视频观看,而不是播放我选择的其他视频。
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);
}
}
虽然这已经发布了一段时间后,我面临同样的问题。即使使用videoview,在切换视频时我仍然存在差距。有没有其他方法可以解决这个问题? – dulys 2011-10-21 12:37:26