您的位置:华清远见教育科技集团 >> Android资料 >> Android开发之MediaPlayer视频播放实例  
 
Android开发之MediaPlayer视频播放实例
分享到:

本示例“MediaPlayerVideo.java”主要功能是播放视频文件,因读取视频文件的来源不同,现设置一个文本框来显示其来源,如表1所示。

表1 MediaPlayerVideo.java文本框显示

文件来源 文本框显示
从源文件中播放 LOCAL_VIDEO-播放音乐中...
从文件系统中播放 RESOURCES_ VIDEO-播放音乐中...
从网络中播放 STREAM_ VIDEO-播放音乐中...

播放视频文件前,要确认是否已进入Prepared状态和读入视频文件,取得播放视频的长度。为了确认这两件事情的同步完成时刻,首先要实现onPrepared()和onVideoSizeChanged()方法的监听功能,管理两个事件的同步完成时刻变量mIsVideoReadyToBePlayed 和mIsVideoSizeKnown,当onPrepard()方法被执行时,会设置变量mIsVideoReadyToBePlayed为true,由Initialized状态进入Prepared状态;当onVideoSizeChanged()方法执行时,会设置变量mIsVideoSizeKnown为true,取得播放视频的长度。当变量mIsVideoReadyToBePlayed 和mIsVideoSizeKnown都为true时,调用startVideoPlayback()方法,设置好播放视频的长度,再开始播放。

代码清单1 MediaPlayerAudio.java


package cn.com.farsight.media;

    import android.app.Activity;
    import android.media.AudioManager;
    import android.media.MediaPlayer;
    import android.media.MediaPlayer.OnBufferingUpdateListener;
    import android.media.MediaPlayer.OnCompletionListener;
    import android.media.MediaPlayer.OnPreparedListener;
    import android.media.MediaPlayer.OnVideoSizeChangedListener;
    import android.os.Bundle;
    import android.util.Log;
    import android.view.SurfaceHolder;
    import android.view.SurfaceView;
    import android.widget.TextView;
    import android.widget.Toast;

    public class MediaPlayerVideo extends Activity implements
    OnBufferingUpdateListener, OnCompletionListener,
    OnPreparedListener, OnVideoSizeChangedListener, SurfaceHolder.Callback {
        private static final String TAG = "MediaPlayerDemo";
        private int mVideoWidth;
        private int mVideoHeight;
        private MediaPlayer mMediaPlayer;
        private SurfaceView mPreview;
        private SurfaceHolder holder;
        private String path;
        private TextView mTextView;
        private Bundle extras;
        private static final String MEDIA = "media";
        private static final int LOCAL_AUDIO = 1;
        private static final int STREAM_AUDIO = 2;
        private static final int RESOURCES_AUDIO = 3;
        private static final int LOCAL_VIDEO = 4;
        private static final int STREAM_VIDEO = 5;
        private static final int RESOURCES_VIDEO = 6;
        private boolean mIsVideoSizeKnown = false;
        private boolean mIsVideoReadyToBePlayed = false;
        //MediaPlayerVideo程序
        @Override
        public void onCreate(Bundle savedInstanceState) {
            super.onCreate(savedInstanceState);
            setContentView(R.layout.mediaplayer01);
            mTextView = (TextView) findViewById(R.id.TextView01);
            mPreview = (SurfaceView) findViewById(R.id.surface);
            holder = mPreview.getHolder();
            holder.addCallback(this);
            holder.setType(SurfaceHolder.SURFACE_TYPE_PUSH_BUFFERS);
            extras = getIntent().getExtras();
        }
        //播放视频
        private void playVideo(Integer Media) {
            doCleanUp();
            try {
                switch (Media) {
                    case LOCAL_VIDEO:
                    //设定视频文件路径
                    path = "/sdcard/navy.3gp";//测试用的视频文件
                    //path = "";
                    if (path == "") {
                        //警告User尚未建立视频文件
                        Toast.makeText(MediaPlayerVideo.this, "尚未建立视频文件",Toast.LENGTH_LONG).show();
                    }
                    mTextView.setText("LOCAL_VIDEO-播放视频中...");
                    break;
                    case STREAM_VIDEO:
                    //警告User尚未建立视频文件的URL.
                    path = " //www.yinyuetai.com/video/307729 ";//测试用的视频文件
                    //path = "";
                    if (path == "") {
                        //警告User尚未建立视频文件的URL.
                        Toast.makeText(MediaPlayerVideo.this,"Please edit MediaPlayerDemo_
                        Video Activity and set the path variable to your media file URL.",Toast.LENGTH_LONG).show();
                    }
                    mTextView.setText("STREAM_VIDEO-播放视频中...");
                    break;
                    case RESOURCES_VIDEO:
                    //本地视频文件要放在/res/raw目录内且提供resid给MediaPlayer.create()
                    //mMediaPlayer = new MediaPlayer();
                    //mMediaPlayer.setDataSource("/sdcard/navy.3gp");
                    mMediaPlayer = MediaPlayer.create(this, R.raw.navy);
                    //执行create()时,会调用prepare()
                    mMediaPlayer.setDisplay(holder);
                    //mMediaPlayer.prepare();
                    mMediaPlayer.setOnBufferingUpdateListener(this);
                    mMediaPlayer.setOnCompletionListener(this);
                    mMediaPlayer.setOnPreparedListener(this);
                    mMediaPlayer.setOnVideoSizeChangedListener(this);
                    mMediaPlayer.setAudioStreamType(AudioManager.STREAM_MUSIC);
                    mMediaPlayer.start();
                    mTextView.setText("RESOURCES_VIDEO-播放视频中... ");
                    break;
                }
                //实例化MedialPlayer且设定监听功能
                if (Media == LOCAL_VIDEO || Media == STREAM_VIDEO) {
                    mMediaPlayer = new MediaPlayer();
                    mMediaPlayer.setDataSource(path);
                    mMediaPlayer.setDisplay(holder);
                    mMediaPlayer.prepare();
                    mMediaPlayer.setOnBufferingUpdateListener(this);
                    mMediaPlayer.setOnCompletionListener(this);
                    mMediaPlayer.setOnPreparedListener(this);
                    mMediaPlayer.setOnVideoSizeChangedListener(this);
                    mMediaPlayer.setAudioStreamType(AudioManager.STREAM_MUSIC);
                }
            } catch (Exception e) {
                Log.e(TAG, "error: " + e.getMessage(), e);
            }
        }
        //onBufferingUpdate
        public void onBufferingUpdate(MediaPlayer arg0, int percent) {
            Log.d(TAG, "onBufferingUpdate percent: " + percent);
        }
        //onCompletion
        public void onCompletion(MediaPlayer arg0) {
            Log.d(TAG, "onCompletion called");
        }
        //onVideoSizeChanged
        public void onVideoSizeChanged(MediaPlayer mp, int width, int height) {
            Log.v(TAG, "onVideoSizeChanged called");
            Toast.makeText(MediaPlayerVideo.this, "onVideoSizeChanged called",Toast.LENGTH_
            LONG).show();
            if (width == 0 || height == 0) {
                Log.e(TAG, "invalid video width(" + width +") or height(" + height + ")");
                return;
            }
            mIsVideoSizeKnown = true;
            mVideoWidth = width;
            mVideoHeight = height;
            if (mIsVideoReadyToBePlayed && mIsVideoSizeKnown) {
                startVideoPlayback();
            }
        }
        //onPrepared
        public void onPrepared(MediaPlayer mediaplayer) {
            Log.d(TAG, "onPrepared called");
            Toast.makeText(MediaPlayerVideo.this, "onPrepared called",Toast.LENGTH_LONG).
            show();
            mIsVideoReadyToBePlayed = true;
            if (mIsVideoReadyToBePlayed && mIsVideoSizeKnown) {
                startVideoPlayback();
            }
        }
        //surfaceChanged
        public void surfaceChanged(SurfaceHolder surfaceholder, int I, int j, int k) {
            Log.d(TAG, "surfaceChanged called");
        }
        //surfaceDestroyed
        public void surfaceDestroyed(SurfaceHolder surfaceholder) {
            Log.d(TAG, "surfaceDestroyed called");
        }
        //调用playVideo(),播放视频
        public void surfaceCreated(SurfaceHolder holder) {
            Log.d(TAG, "surfaceCreated called");
            playVideo(extras.getInt(MEDIA));
        }
        //onPause
        @Override
        protected void onPause() {
            super.onPause();
            releaseMediaPlayer();
            doCleanUp();
        }
        //关闭MediaPlayerVideo程序且释放MediaPlayer
        @Override
        protected void onDestroy() {
            super.onDestroy();
            releaseMediaPlayer();
            doCleanUp();
        }
        //releaseMediaPlayer
        private void releaseMediaPlayer() {
            if (mMediaPlayer != null) {
                mMediaPlayer.release();
                mMediaPlayer = null;
            }
        }
        //doCleanUp
        private void doCleanUp() {
            mVideoWidth = 0;
            mVideoHeight = 0;
            mIsVideoReadyToBePlayed = false;
            mIsVideoSizeKnown = false;
        }
        //startVideoPlayback
        private void startVideoPlayback() {
            Log.v(TAG, "startVideoPlayback");
            Toast.makeText(MediaPlayerVideo.this, "startVideoPlayback()",Toast.LENGTH_LONG).show();
            holder.setFixedSize(mVideoWidth, mVideoHeight);
            mMediaPlayer.start();
        }
    }

 更多相关文章

·Android开发之MediaPlayer音频播放实例
·Android开发之MediaPlayer音频视频播放
·Android基于MediaPlayer的视频播放
·解读Android MediaPlayer 详细使用方法
·Android系统提供内置的媒体格式