Android视频播放器
分为两部分,本地视频播放器,和在线视频播放器,与音乐播放器类似,主要是用到了提供的MediaPlayer对象,此处与音乐播放器不同是需要一个SurfaceView
控件,来实现对视频画面的显示,并且要求当Activity不在前台时视频播放停止,当Activity回到前台时,视频播放继续。
本地视频播放器
本地视频播放器应用的实现主要分为以下两个步骤:
设计界面,与音乐播放器不同的是加入了
SurfaceView
控件
设计播放,暂停,停止,重播四个Button的onClick
事件
界面设计
比较简单,主要包括以下部分:
1. 文本输入框来获取本地视频文件的路径。
2. 四个Button
对应播放、暂停、重播、停止。
3. SurfaceView
控件用来显示视频画面。
代码如下:
<?xml version="1.0" encoding="utf-8"?>
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
android:orientation="vertical"
android:layout_width="fill_parent"
android:layout_height="fill_parent"
android:background="#FFFFFF"
>
<TextView
android:layout_width="fill_parent"
android:layout_height="wrap_content"
android:text="@string/filename"
/>
<EditText
android:layout_width="fill_parent"
android:layout_height="wrap_content"
android:id="@+id/filename"
android:text="http://10.170.61.83:8080/videonews/oppo.3gp"
/>
<LinearLayout
android:orientation="horizontal"
android:layout_width="fill_parent"
android:layout_height="wrap_content"
>
<ImageButton
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:src="@drawable/play"
android:id="@+id/playbutton"
android:onClick="mediaplay"
/>
<ImageButton
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:src="@drawable/pause"
android:id="@+id/pausebutton"
android:onClick="mediaplay"
/>
<ImageButton
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:src="@drawable/reset"
android:id="@+id/resetbutton"
android:onClick="mediaplay"
/>
<ImageButton
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:src="@drawable/stop"
android:id="@+id/stopbutton"
android:onClick="mediaplay"
/>
</LinearLayout>
<SurfaceView
android:layout_width="fill_parent"
android:layout_height="240dp"
android:id="@+id/surfaceView"
/>
</LinearLayout>
功能实现
主要对四个Button的onClick事件完成编写,这里以播放按钮为例:
1. 从文本输入框获取本地视频文件的路径。
2. 获取SurfaceView对象,并且通过getHolder()
获取SurfaceView的控制对象从而进行配置。例如:
surfaceView.getHolder().setType(SurfaceHolder.SURFACE_TYPE_PUSH_BUFFERS);
把输送给surfaceView的视频画面,直接显示到屏幕上,不要维持它自身的缓冲区。
3. 创建MediaPlayer对象,并且进行配置:
mediaPlayer.reset();
mediaPlayer.setDataSource(path);//本地路径
mediaPlayer.setDisplay(surfaceView.getHolder());//输出位置
mediaPlayer.prepare();//缓冲
mediaPlayer.setOnPreparedListener(new PrepareListener(position));
这里我们还要创建一个内部类来实现OnPreparedListener接口,用来完成对缓冲完成事件的监听:
private final class PrepareListener implements OnPreparedListener{
private int position;
public PrepareListener(int position) {
this.position = position;
}
public void onPrepared(MediaPlayer mp) {
if(position>0)
mediaPlayer.seekTo(position);
mediaPlayer.start();//播放视频
}
}
这里我们不难发现,事实上这与音乐播放器的第一个区别在于对MediaPlayer对象配置时要指定视频流的输出对象,这里使用setDisplay()
方法来实现,需要一个SurfaceHolder
对象作为参数,我们通过getHolder()
方法来获取这个对象。
Activity回到前台继续播放
之前的音乐播放器我们通过Activity的生命周期方法onPause()
和onResume()
方法来实现Activity不在前台时停止音乐播放,回到前台时继续播放。
这里有一点非常重要:
SurfaceView所在的Activity离开前台后,该SurfaceView被摧毁,而当该Activity回到前台后,onResume()
方法执行以后,SurfaceView才被创建,因此,我们要为SurfaceView添加一个回调用来监听SurfaceView重新被创建的事件。
surfaceView.getHolder().addCallback(new SurfaceCallback());
这里我们编写内部类来实现callback接口:
private final class SurfaceCallback implements Callback{
public void surfaceChanged(SurfaceHolder holder, int format, int width, int height) {
}
public void surfaceCreated(SurfaceHolder holder) {
if(position>0 && path!=null){
play(position);
position = 0;
}
}
public void surfaceDestroyed(SurfaceHolder holder) {
if(mediaPlayer.isPlaying()){
position = mediaPlayer.getCurrentPosition();
mediaPlayer.stop();
}
}
}
在线视频播放器
要实现在线视频播放,首先咱们的视频文件得是流媒体文件,这里有两种分发类型:
渐进式下载,使用HTTP协议或FTP协议。
实时流媒体,使用RTP,RTSP协议。(需要流媒体服务器)
部署Web应用
将流媒体文件放到Web应用的WebRoot文件夹下,并将Web应用部署到tomcat上,这时,我们打开浏览器,访问这个文件,是可以通过浏览器直接下载该文件,证明web应用部署正确。
修改DataSource
这里把原来的本地路径改为网络路径,例如:xxx.xx.xx.xx:8080/webapp/test.3gp
。
failed.: status=0x80000000 错误
记得添加网络访问权限:
<uses-permission android:name="android.permission.INTERNET" />
至此,完成了本地和网络视频的播放功能。