随时随地阅读更多技术实战干货,获取项目源码、学习资料,请关注源代码社区公众号(ydmsq666)
从上文中可以看出,使用VideoView播放视频简单、方便,但有些早期的开发者还是喜欢使用MediaPlayer来播放视频,但是MediaPlayer主要用于播放音频,没有提供图像输出界面,此时需要借助于SurfaceView来显示MediaPlayer播放的图像输出。下面用一个简单示例来演示:
Activity:
package com.home.activity;
import java.io.IOException;
import android.app.Activity;
import android.media.AudioManager;
import android.media.MediaPlayer;
import android.os.Bundle;
import android.os.Environment;
import android.view.SurfaceHolder;
import android.view.SurfaceView;
import android.view.View;
import com.home.surfaceviewplayvideo.R;
public class SurfaceViewPlayVideoActivity extends Activity {
private SurfaceView surfaceView;
private MediaPlayer mplayer;
// 记录当前视频的播放位置
private int position;
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
// 创建MediaPlayer对象
mplayer = new MediaPlayer();
// 获取SurfaceView组件实例
surfaceView = (SurfaceView) findViewById(R.id.main_surfaceView);
// 设置SurfaceView自己不管理缓冲区
surfaceView.getHolder()
.setType(SurfaceHolder.SURFACE_TYPE_PUSH_BUFFERS);
// 设置播放时打开屏幕
surfaceView.getHolder().setKeepScreenOn(true);
surfaceView.getHolder().addCallback(new SurfaceListener());
}
public void click(View v) {
try {
switch (v.getId()) {
case R.id.main_btn_play:
play();
break;
case R.id.main_btn_pause:
if (mplayer.isPlaying()) {
mplayer.pause();
} else {
mplayer.start();
}
break;
case R.id.main_btn_stop:
if (mplayer.isPlaying())
mplayer.stop();
break;
}
} catch (Exception e) {
e.printStackTrace();
}
}
private void play() throws IOException {
mplayer.reset();
mplayer.setAudioStreamType(AudioManager.STREAM_MUSIC);
// 设置需要播放的视频
mplayer.setDataSource(Environment.getExternalStorageDirectory()
+ "/devil_may_cry.mp4");
// 把视频画面输出到surfaceView
mplayer.setDisplay(surfaceView.getHolder());
mplayer.prepare();
mplayer.start();
}
private class SurfaceListener implements SurfaceHolder.Callback {
@Override
public void surfaceChanged(SurfaceHolder holder, int format, int width,
int height) {
}
@Override
public void surfaceCreated(SurfaceHolder holder) {
if (position > 0) {
try {
// 开始播放
play();
// 并直接从指定位置开始播放
mplayer.seekTo(position);
position = 0;
} catch (IOException e) {
e.printStackTrace();
}
}
}
@Override
public void surfaceDestroyed(SurfaceHolder holder) {
}
}
// 当其他Activity被打开时
@Override
protected void onPause() {
super.onPause();
if (mplayer.isPlaying()) {
// 保存当前的播放位置
position = mplayer.getCurrentPosition();
mplayer.stop();
}
}
@Override
protected void onDestroy() {
super.onDestroy();
// 停止播放
if (mplayer.isPlaying())
mplayer.stop();
// 释放资源
mplayer.release();
}
}
布局XML:
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
android:layout_width="match_parent"
android:layout_height="match_parent"
android:orientation="vertical" >
<LinearLayout
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:orientation="horizontal" >
<Button
android:id="@+id/main_btn_play"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:onClick="click"
android:text="播放" />
<Button
android:id="@+id/main_btn_pause"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:onClick="click"
android:text="暂停" />
<Button
android:id="@+id/main_btn_stop"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:onClick="click"
android:text="停止" />
</LinearLayout>
<SurfaceView
android:id="@+id/main_surfaceView"
android:layout_width="match_parent"
android:layout_height="match_parent" />
</LinearLayout>
从上面的开发过程不难看出,使用MediaPlayer播放视频要复杂一些,而且需要自己开发控制按钮来控制视频的播放。所以一般推荐使用VideoView来播放视频。