使用MediaPlayer和SurFaceView播放视频
VideoView播放视频地址:http://blog.csdn.net/bobo8945510/article/details/52260069
使用VideoView播放视频简单、方便、但有些早起的开发者更喜欢使用MediaPlayer来播放视频,但由于MediaPlayer主要用于播放音频,因此没有提供图像输出届满,此时就需要借助SurfaceView来现实MediaPlayer播放图像输出。
使用MediaPlayer播放视频的步骤如下。
1、创建MediaPlayer对象,并让他家在指定的视频文件。
2、在界面布局文件中定义SurfaceView组件,或在程序中创建SuiraceView组件。并未SuifaceView的SuifaceHolder添加Callback监听器
3、调用MediaPlayer对象的setDisplay(SuifaceHolder sh)将所播放的视频图像输出到指定的SuifaceView组件
4、调用MediaPlayer对象的start()、stop、pause()方法控制视频播放。
代码:
import android.app.Activity;
import android.media.AudioManager;
import android.media.MediaPlayer;
import android.os.Bundle;
import android.util.DisplayMetrics;
import android.view.SurfaceHolder;
import android.view.SurfaceView;
import android.view.View;
import android.view.View.OnClickListener;
import android.view.WindowManager;
import android.widget.ImageButton;
import android.widget.RelativeLayout.LayoutParams;
import java.io.IOException;
public class MainActivity extends Activity implements OnClickListener
{
SurfaceView surfaceView;
ImageButton play, pause, stop;
MediaPlayer mPlayer;
// 记录当前视频的播放位置
int position;
@Override
public void onCreate(Bundle savedInstanceState)
{
super.onCreate(savedInstanceState);
setContentView(R.layout.main);
// 获取界面中的三个按钮
play = (ImageButton) findViewById(R.id.play);
pause = (ImageButton) findViewById(R.id.pause);
stop = (ImageButton) findViewById(R.id.stop);
// 为三个按钮的单击事件绑定事件监听器
play.setOnClickListener(this);
pause.setOnClickListener(this);
stop.setOnClickListener(this);
// 创建MediaPlayer
mPlayer = new MediaPlayer();
surfaceView = (SurfaceView) this.findViewById(R.id.surfaceView);
// 设置播放时打开屏幕
surfaceView.getHolder().setKeepScreenOn(true);
surfaceView.getHolder().addCallback(new SurfaceListener());
}
@Override
public void onClick(View source)
{
try
{
switch (source.getId())
{
// 播放按钮被单击
case R.id.play:
play();
break;
// 暂停按钮被单击
case R.id.pause:
if (mPlayer.isPlaying())
{
mPlayer.pause();
}
else
{
mPlayer.start();
}
break;
// 停止按钮被单击
case R.id.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("/mnt/sdcard/movie.3gp");
// 把视频画面输出到SurfaceView
mPlayer.setDisplay(surfaceView.getHolder()); // ①
mPlayer.prepare();
// 获取窗口管理器
WindowManager wManager = getWindowManager();
DisplayMetrics metrics = new DisplayMetrics();
// 获取屏幕大小
wManager.getDefaultDisplay().getMetrics(metrics);
// 设置视频保持纵横比缩放到占满整个屏幕
surfaceView.setLayoutParams(new LayoutParams(metrics.widthPixels, mPlayer.getVideoHeight() * metrics.widthPixels/ mPlayer.getVideoWidth()));
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 (Exception e)
{
e.printStackTrace();
}
}
}
@Override
public void surfaceDestroyed(SurfaceHolder holder)
{
}
}
// 当其他Activity被打开时,暂停播放
@Override
protected void onPause()
{
if (mPlayer.isPlaying())
{
// 保存当前的播放位置
position = mPlayer.getCurrentPosition();
mPlayer.stop();
}
super.onPause();
}
@Override
protected void onDestroy()
{
// 停止播放
if (mPlayer.isPlaying()) mPlayer.stop();
// 释放资源
mPlayer.release();
super.onDestroy();
}
}
从两篇文章可以看出,MediaPlayer操作起来比较复杂,所以推荐使用VideoView来播放视频