[java]
package cn.c;
import java.io.File;
import java.io.IOException;
import android.app.Activity;
import android.media.MediaPlayer;
import android.media.MediaPlayer.OnCompletionListener;
import android.media.MediaPlayer.OnErrorListener;
import android.media.MediaPlayer.OnInfoListener;
import android.media.MediaPlayer.OnPreparedListener;
import android.media.MediaPlayer.OnSeekCompleteListener;
import android.media.MediaPlayer.OnVideoSizeChangedListener;
import android.os.Bundle;
import android.os.Environment;
import android.view.Display;
import android.view.Su易做图ceHolder;
import android.view.Su易做图ceView;
import android.widget.LinearLayout;
/**
* 利用MidiaPlayer播放视频
* 涉及到Su易做图ceView和Su易做图ceHolder
* MediaPlayer主要用于播放音频,它没有提供输出图像的输出界面
* 此时我们可用Su易做图ceView控件将它与MediaPlayer结合起来
* 就能达到视频的输出.如果说Su易做图ceView是用来绘制(显示)视频的
* 那么Su易做图ceHolder就是用来控制Su易做图ceView的
* 流程:
* 1 设置MediaPlayer将要播放的视频
* mMediaPlayer.setDataSource(path);
* 2 设置MediaPlayer的视频输出界面
* mMediaPlayer.setDisplay(mSu易做图ceHolder);
* 3 MediaPlayer进行解码工作
* mMediaPlayer.prepareAsync();
* 4 MediaPlayer开始播放
* mMediaPlayer.start();
*/
/**
* 参考资料:http://www.embedu.org/Column/Column503.htm
* 利用MidiaPlayer播放视频大致的流程:
* 创建播放器对象-->设置需要播放的视频的来源-->
* 对视频进行解码等准备工作-->开始播放-->(暂停/重启)停止播放
* 对应这些流程,在MediaPlayer中都定义了相关方法;
* 而且,在调用这些方法后,MediaPlayer可以进入不同的状态.
* 这些方法和状态都很好理解,读者可以参照上图来了解.
* 另外,因为在设置播放的视频的视频数据源之后,它需要对其进行解码(调用prepare()方法)
* 这是一个比较耗时的操作,为了避免应用程序阻止,
* 可以使用它的prepareAsync()方法配合OnPreparedListener易做图来让其异步操作.
* 注意,只有MediaPlayer的准备工作做完后,才能开始播放
* MediaPlayer本身不能显示视频内容,它只能控制视频的播放
* 如果要使用MediaPlayer来播放视频,还需要配合Su易做图ceView来显示视频
* 且将MediaPlayer中解码的视频数据在Su易做图ceView中播放,需要调用MediaPlayer中的setDisplay()
* 它接受一个Su易做图ceHolder对象,可将我们用于
* 播放视频的Su易做图ceView对应的Su易做图ceHolder对象作为参数
* 这样,MediaPlayer和Su易做图ceView就建立起了关联.
*/
public class MainActivity extends Activity implements
OnCompletionListener,OnErrorListener,OnInfoListener,OnPreparedListener,
OnSeekCompleteListener,OnVideoSizeChangedListener,Su易做图ceHolder.Callback{
private Su易做图ceView mSu易做图ceView;
private Su易做图ceHolder mSu易做图ceHolder;
private Display mDisplay;
private MediaPlayer mMediaPlayer;
int videoWidth=0;
int videoHeight=0;
@Override
public void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.main);
mDisplay=getWindowManager().getDefaultDisplay();
mSu易做图ceView=(Su易做图ceView) findViewById(R.id.su易做图ceView);
mSu易做图ceHolder=mSu易做图ceView.getHolder();
//Su易做图ceHolder是用于管理Su易做图ceView对象
//那它是怎么做到管理的呢?即用mSu易做图ceHolder
//添加回调即addCallback.
//该类实现了Su易做图ceHolder.Callback接口,所以addCallback(this)
//在Su易做图ceHolder.Callback接口中一共有三个方法来实现对于
//Su易做图ceView对象的管理,即:
//su易做图ceCreated()
//su易做图ceChanged()
//su易做图ceDestroyed()
//概况:Su易做图ceHolder主要作用是监控底层的情况
mSu易做图ceHolder.addCallback(this);
mSu易做图ceHolder.setType(Su易做图ceHolder.SURFACE_TYPE_PUSH_BUFFERS);
mMediaPlayer=new MediaPlayer();
mMediaPlayer.setOnCompletionListener(this);
mMediaPlayer.setOnErrorListener(this);
mMediaPlayer.setOnInfoListener(this);
mMediaPlayer.setOnPreparedListener(this);
mMediaPlayer.setOnSeekCompleteListener(this);
mMediaPlayer.setOnVideoSizeChangedListener(this);
String path=Environment.getExternalStorageDirectory().getPath()
+File.separator+"Test_Movie.m4v";
try {
//设置MediaPlayer将要播放的视频
mMediaPlayer.setDataSource(path);
} catch (IllegalArgumentException e) {
e.printStackTrace();
finish();
} catch (IllegalStateException e) {
e.printStackTrace();
finish();
} catch (IOException e) {
e.printStackTrace();
finish();
}
}
//来自于Su易做图ceHolder.Callback接口
//创建Su易做图ceView完成时,会调用该方法
public void su易做图ceCreated(Su易做图ceHolder holder) {
//设置MediaPlayer的视频输出界面
//只显示音频而不显示视频时可不调用这个方法
mMediaPlayer.setDisplay(mSu易做图ceHolder);