Android视频播放器

来源:互联网 发布:殊知的意思是什么 编辑:程序博客网 时间:2024/04/29 15:54

  • Android视频播放器
    • 本地视频播放器
      • 界面设计
      • 功能实现
      • Activity回到前台继续播放
    • 在线视频播放器
      • 部署Web应用
      • 修改DataSource
      • failed status0x80000000 错误

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" />

至此,完成了本地和网络视频的播放功能。

1 1