Android视频播放器

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
    点赞
  • 4
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值