Android之 MediaPlayer和SurfaceView播放视频

  1、创建MediaPlayer对象,并让它加载指定的视频文件。

  2、在界面布局中定义SurfaceView组件,或在程序中创建SurfaceView组件,并为SurfaceView的SurfaceHolder添加Callback监听器。

  3、调用MediaPlayer对象的setDisplay(SurfaceHolder sh)将所播放的视频图像输出到指定的SurfaceView组件。

  4、调用MediaPlayer对象的start()、stop()和pause()方法控制视频的播放。
public class SurfaceViewPlayVideo 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);
        // 获取界面中的3个按钮
        play = (ImageButton) findViewById(R.id.play);
        pause = (ImageButton) findViewById(R.id.pause);
        stop = (ImageButton) findViewById(R.id.stop);
        // 为3个按钮的单击事件绑定事件监听器
        play.setOnClickListener(this);
        pause.setOnClickListener(this);
        stop.setOnClickListener(this);        
        // 创建MediaPlayer
        mPlayer = new MediaPlayer();
        surfaceView = (SurfaceView) this.findViewById(R.id.surfaceView);
        // 设置SurfaceView自己不管理的缓冲区
        surfaceView.getHolder().setType(
            SurfaceHolder.SURFACE_TYPE_PUSH_BUFFERS);
        // 设置播放时打开屏幕
        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();
        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();
    }
}

猜你喜欢

转载自yingang-1982.iteye.com/blog/2080600