MediaPlayer大家一定不陌生,可以用于播放视频和音频。之前我们已经在《Android 多媒体应用——MediaPlayer音频播放 》文章中讲过MediaPlayer播放音频了,今天来看MediaPlayer播放视频。
MediaPlayer播放视频需要与SurfaceView配合使用。
SurfaceView
SurfaceView可以直接从内存或者DMA等硬件接口取得图像数据。它的特点是:SurfaceView有自己的绘制线程,它的绘制是独立于主线程的,不依靠主线程。SurfaceView依靠自己的绘制线程绘制图像。也就是说它可以在主线程之外的线程中向屏幕绘图上。这样可以避免画图任务繁重的时候造成主线程阻塞,从而提高了程序的反应速度。在游戏开发中多用到SurfaceView,游戏中的背景、人物、动画等等尽量在画布canvas中画出。
SurfaceView的使用是很广泛的,这里我们主要先学习它与MediaPlayer搭配实现视频的播放。
视频播放
1. 首先在布局中定义SurfaceView。
<LinearLayout 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"
tools:context=".MainActivity">
<Button
android:id="@+id/button_surface"
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:text="播放视频"/>
<SurfaceView
android:id="@+id/surface"
android:layout_width="match_parent"
android:layout_height="match_parent" />
</LinearLayout>
2. Activity中获得SurfaceView的对象。
3. 获得MediaPlayer的对象。
4. 获得视频的来源,通过调用方法setDataSource(String path)。
5. 设置视频的输出方式,通过调用方法setAudioStreamType(int streamtype)。
6. 调用setDisplay(SurfaceHolder sh)方法,设置视频在SrufaceView中显示。
7. 调用prepare()方法,准备播放视频。
8. 调用start(), stop(), pause()等方法对视频的播放进行操作。
public class MainActivity extends Activity {
private Button mButtonSurace;
private SurfaceView mSurfaceView;
private MediaPlayer player;
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
mButtonSurace = (Button) findViewById(R.id.button_surface);
mSurfaceView = (SurfaceView) findViewById(R.id.surface);
mButtonSurace.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View v) {
if (player == null) {
player = new MediaPlayer();
}
player.reset();//复位
try {
player.setDataSource(Environment.getExternalStorageDirectory() + "/xiaoxian.3gp");//设置播放的视频资源
player.setAudioStreamType(AudioManager.STREAM_MUSIC);//设置视频的输出形式。
player.setDisplay(mSurfaceView.getHolder());//设置在SurfaceView中显示
player.prepare();//准备
player.setOnPreparedListener(new MediaPlayer.OnPreparedListener() {
@Override
public void onPrepared(MediaPlayer mp) {
mp.start();//视频准备完成后,开始播放
}
});
} catch (IOException e) {
e.printStackTrace();
}
}
});
}
}