首先,我们来定义一个布局文件如下,为了方便起见,我们仅仅只在该布局中定义了一个SurfaceView:
<FrameLayout xmlns:android="http://schemas.android.com/apk/res/android"
xmlns:tools="http://schemas.android.com/tools"
android:layout_width="match_parent"
android:layout_height="match_parent"
android:orientation="vertical"
android:id="@+id/videoLayout" >
<SurfaceView
android:id="@+id/surface"
android:layout_width="fill_parent"
android:layout_height="fill_parent"
android:layout_gravity="center">
</SurfaceView>
</FrameLayout>
主程序代码如下:
public class MainActivity extends Activity implements SurfaceHolder.Callback {
private MediaPlayer firstPlayer, //负责播放进入视频播放界面后的第一段视频
nextMediaPlayer, //负责一段视频播放结束后,播放下一段视频
cachePlayer, //负责setNextMediaPlayer的player缓存对象
currentPlayer; //负责当前播放视频段落的player对象
//负责配合mediaPlayer显示视频图像播放的surfaceView
private SurfaceView surface;
private SurfaceHolder surfaceHolder;
//底部聊天栏
private LinearLayout bottom_bar_layout;
private FrameLayout video_layout;
//================================================================
//存放所有视频端的url
private ArrayList<String> VideoListQueue = new ArrayList<String>();
//所有player对象的缓存
private HashMap<String, MediaPlayer> playersCache = new HashMap<String, MediaPlayer>();
//当前播放到的视频段落数
private int currentVideoIndex;
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
this.setRequestedOrientation(ActivityInfo.SCREEN_ORIENTATION_LANDSCAPE);
//初始化界面控件
initView();
}
protected void onDestroy() {
super.onDestroy();
if (firstPlayer != null) {
if (firstPlayer.isPlaying()) {
firstPlayer.stop();
}
firstPlayer.release();
}
if (nextMediaPlayer != null) {
if (nextMediaPlayer.isPlaying()) {
nextMediaPlayer.stop();
}
nextMediaPlayer.release();
}
if (currentPlayer != null) {
if (currentPlayer.isPlaying()) {
currentPlayer.stop();
}
currentPlayer.release();
}
currentPlayer = null;
}
private void initView() {
surface = (SurfaceView) findViewById(R.id.surface);
surfaceHolder = surface.getHolder();// SurfaceHolder是SurfaceView的控制接口
surfaceHolder.addCallback(this); // 因为这个类实现了SurfaceHolder.Callback接口,所以回调参数直接this
/*bottom_bar_layout = (LinearLayout) findViewById(R.id.live_buttom_bar);*/
//点击屏幕任何地点,控制底部聊天栏的隐藏或显示
/* video_layout = (FrameLayout) findViewById(R.id.videoLayout);
video_layout.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View arg0) {
if (bottom_bar_layout.getVisibility() == View.VISIBLE) {
bottom_bar_layout.setVisibility(View.GONE);
} else {
bottom_bar_layout.setVisibility(View.VISIBLE);
}
}
});*/
}
@Override
public void surfaceChanged(SurfaceHolder arg0, int arg1, int arg2, int arg3) {
// TODO 自动生成的方法存根
}
@Override
public void surfaceCreated(SurfaceHolder arg0) {
//surfaceView创建完毕后,首先获取该直播间所有视频分段的url
getVideoUrls();
//然后初始化播放手段视频的player对象
initFirstPlayer();
}
@Override
public void surfaceDestroyed(SurfaceHolder arg0) {
// TODO 自动生成的方法存根
}
/*
* 初始化播放首段视频的player
*/
private void initFirstPlayer() {
firstPlayer = new MediaPlayer();
firstPlayer.setAudioStreamType(AudioManager.STREAM_MUSIC);
firstPlayer.setDisplay(surfaceHolder);
firstPlayer
.setOnCompletionListener(new MediaPlayer.OnCompletionListener() {
@Override
public void onCompletion(MediaPlayer mp) {
onVideoPlayCompleted(mp);
}
});
//设置cachePlayer为该player对象
cachePlayer = firstPlayer;
initNexttPlayer();
//player对象初始化完成后,开启播放
startPlayFirstVideo();
}
private void startPlayFirstVideo() {
try {
firstPlayer.setDataSource(VideoListQueue.get(currentVideoIndex));
firstPlayer.prepare();
firstPlayer.start();
} catch (IOException e) {
// TODO 自动生成的 catch 块
e.printStackTrace();
}
}
private void initNexttPlayer() {
new Thread(new Runnable() {
@Override
public void run() {
for (int i = 1; i < VideoListQueue.size(); i++) {
nextMediaPlayer = new MediaPlayer();
nextMediaPlayer
.setAudioStreamType(AudioManager.STREAM_MUSIC);
nextMediaPlayer
.setOnCompletionListener(new MediaPlayer.OnCompletionListener() {
@Override
public void onCompletion(MediaPlayer mp) {
onVideoPlayCompleted(mp);
}
});
try {
nextMediaPlayer.setDataSource(VideoListQueue.get(i));
nextMediaPlayer.prepare();
} catch (IOException e) {
// TODO 自动生成的 catch 块
e.printStackTrace();
}
//set next mediaplayer
cachePlayer.setNextMediaPlayer(nextMediaPlayer);
//set new cachePlayer
cachePlayer = nextMediaPlayer;
playersCache.put(String.valueOf(i), nextMediaPlayer);
}
}
}).start();
}
private void onVideoPlayCompleted(MediaPlayer mp) {
mp.setDisplay(null);
//get next player
currentPlayer = playersCache.get(String.valueOf(++currentVideoIndex));
if (currentPlayer != null) {
currentPlayer.setDisplay(surfaceHolder);
} else {
Toast.makeText(MainActivity.this, "视频播放完毕..", Toast.LENGTH_SHORT)
.show();
}
}
private void getVideoUrls() {
for (int i = 0; i < 3; i++) {
String url = getURI(i);
VideoListQueue.add(url);
}
}
private String getURI(int index) {
String url="abc";
if(index==0)
{
/*return "要播放的第"+index+"段视频的URI";*/
url="/sdcard/Download/video1.mp4";
}
else if(index==1)
{
url="/sdcard/Download/video2.mp4";
}
else if(index==2)
{
url="/sdcard/Download/video3.mp4";
}
return url;
}
}