本示例“MediaPlayerVideo.java”主要功能是播放視頻文件,因讀取視頻文件的來源不同,現(xiàn)設(shè)置一個文本框來顯示其來源,如表1所示。
表1 MediaPlayerVideo.java文本框顯示
文件來源 |
文本框顯示 |
從源文件中播放 |
LOCAL_VIDEO-播放音樂中... |
從文件系統(tǒng)中播放 |
RESOURCES_ VIDEO-播放音樂中... |
從網(wǎng)絡(luò)中播放 |
STREAM_ VIDEO-播放音樂中... |
播放視頻文件前,要確認(rèn)是否已進(jìn)入Prepared狀態(tài)和讀入視頻文件,取得播放視頻的長度。為了確認(rèn)這兩件事情的同步完成時刻,首先要實(shí)現(xiàn)onPrepared()和onVideoSizeChanged()方法的監(jiān)聽功能,管理兩個事件的同步完成時刻變量mIsVideoReadyToBePlayed 和mIsVideoSizeKnown,當(dāng)onPrepard()方法被執(zhí)行時,會設(shè)置變量mIsVideoReadyToBePlayed為true,由Initialized狀態(tài)進(jìn)入Prepared狀態(tài);當(dāng)onVideoSizeChanged()方法執(zhí)行時,會設(shè)置變量mIsVideoSizeKnown為true,取得播放視頻的長度。當(dāng)變量mIsVideoReadyToBePlayed 和mIsVideoSizeKnown都為true時,調(diào)用startVideoPlayback()方法,設(shè)置好播放視頻的長度,再開始播放。
代碼清單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:
//設(shè)定視頻文件路徑
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目錄內(nèi)且提供resid給MediaPlayer.create()
//mMediaPlayer = new MediaPlayer();
//mMediaPlayer.setDataSource("/sdcard/navy.3gp");
mMediaPlayer = MediaPlayer.create(this, R.raw.navy);
//執(zhí)行create()時,會調(diào)用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;
}
//實(shí)例化MedialPlayer且設(shè)定監(jiān)聽功能
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");
}
//調(diào)用playVideo(),播放視頻
public void surfaceCreated(SurfaceHolder holder) {
Log.d(TAG, "surfaceCreated called");
playVideo(extras.getInt(MEDIA));
}
//onPause
@Override
protected void onPause() {
super.onPause();
releaseMediaPlayer();
doCleanUp();
}
//關(guān)閉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();
}
}