我可以通过实现 OnCompletionListener 将数据源设置为不同的文件来很好地播放视频。那里没有问题。我调用 reset() 和 prepare() 就好了。
我一直想不通的是,如何摆脱数据源更改和新视频启动之间的 1-2 秒间隙屏幕闪烁。间隙显示黑屏,我还没有找到任何绕过它的方法。
我尝试将父 View 的背景设置为图像,但它设法绕过了它。即使 SurfaceView 是透明的(默认情况下是透明的。)我也尝试过同时播放多个视频文件,并在一个结束时切换媒体播放器的显示,另一个应该开始。
我尝试的最后一件事是在视频“准备”时在背景中临时显示第二个 View ,并在视频准备好开始时将其删除。这也不是很无缝。
有什么办法可以消除这种差距。在循环中运行视频效果非常好,并且完全符合我的要求,只是它正在查看相同的视频,而不是播放我选择的其他视频。
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);
}
}
最佳答案
我也有同样的问题,如下链接所述
VideoView Disappears for a second when video is changed
但如果您尝试使用 Android 4.0+ (ICS),则不会出现此问题。我开始将 VideoView.java 和 MediaPlayer.java 从 4.0 移植到我的应用程序,但这似乎很复杂,直到现在还没有运气。基本上它似乎是旧版本的 native 代码中的一个错误。
关于Android:MediaPlayer 无缝或无缝视频播放,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/3877119/