利用SurfaceView和MediaPlayer打造一款简易的视频播放器

来源:互联网 发布:中国最新经济数据 编辑:程序博客网 时间:2024/06/05 18:00
    大家都知道Android原生的视频播放器是VideoView播放视频,现在第三方的视频播放框架也有好多,但底层都是利用SurfaceView+MediaPlayer来实现的,而Android播放原生控件VideoView就是对surfaceView和MediaPlayer的一层封装。    今天就说一下如何利用SurfaceView和MediaPlayer打造一款简易的视频播放器,播放网络视频。    首先看一下我们的简单的布局文件Xml
<?xml version="1.0" encoding="utf-8"?><RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android"    xmlns:tools="http://schemas.android.com/tools"    android:id="@+id/activity_play_video"    android:layout_width="match_parent"    android:layout_height="match_parent"    tools:context="ledon.com.retrofitdemo.view.PlayVideoActivity">    <SurfaceView        android:id="@+id/surfaceview"        android:layout_width="match_parent"        android:layout_height="match_parent"        android:layout_alignParentTop="true"        android:layout_alignParentLeft="true"        android:layout_alignParentStart="true" /></RelativeLayout>

千万不要忘记添加网络权限在清单中

    接下来看看我们在PlayVideoActivity中的具体实现,
package ledon.com.retrofitdemo.view;import android.media.MediaPlayer;import android.net.Uri;import android.support.v7.app.AppCompatActivity;import android.os.Bundle;import android.view.MotionEvent;import android.view.Surface;import android.view.SurfaceHolder;import android.view.SurfaceView;import android.view.View;import java.io.IOException;import ledon.com.retrofitdemo.R;import ledon.com.retrofitdemo.base.BaseActivity;public class PlayVideoActivity extends BaseActivity   {    private SurfaceView surfaceView;    private MediaPlayer mediaPlayer;    //所有的监听方法都在这个方法中    @Override    protected void initListener() {        //获取网络视频的url        final String url=getIntent().getExtras().getString("url");        //获取SurfaceHolder        SurfaceHolder holder = surfaceView.getHolder();        //设置mediaPlayer的监听方法        mediaPlayer.setOnPreparedListener(new MediaPlayer.OnPreparedListener() {            @Override            public void onPrepared(MediaPlayer mediaPlayer) {                //准备完后,开始播放视频                mediaPlayer.start();            }        });        //为surfaceView添加回调方法        holder.addCallback(new SurfaceHolder.Callback() {            //当surfaceView创建的时候的回调方法            @Override            public void surfaceCreated(SurfaceHolder surfaceHolder) {                mediaPlayer.reset();                //将创建好的surfaceHolder放到mediaplayer中                mediaPlayer.setDisplay(surfaceHolder);                try {                    //为mediaplayer添加视频播放源                    mediaPlayer.setDataSource(PlayVideoActivity.this, Uri.parse(url));                     //异步准备 准备工作在子线程中进行 当播放网络视频时候一般采用此方法                    mediaPlayer.prepareAsync();                } catch (IOException e) {                    e.printStackTrace();                }            }            //当SurfaceView的大小发生改变时候触发该方法            @Override            public void surfaceChanged(SurfaceHolder surfaceHolder, int i, int i1, int i2) {            }          //Surface销毁时回掉            //当Surface销毁时候,同时把MediaPlayer也销毁            @Override            public void surfaceDestroyed(SurfaceHolder surfaceHolder) {                if (mediaPlayer!=null){                    mediaPlayer.stop();                    //释放资源                    mediaPlayer.release();                   // destroyActivity();                }                finish();            }        });        surfaceView.setOnTouchListener(new View.OnTouchListener() {            @Override            public boolean onTouch(View view, MotionEvent motionEvent) {                switch (motionEvent.getAction()){                    case MotionEvent.ACTION_DOWN:                        if (mediaPlayer.isPlaying()){                            mediaPlayer.pause();                        }else {                            mediaPlayer.start();                        }                        break;                }                return true;            }        });    }    //初始化布局    @Override    protected void initLayout(Bundle savedInstanceState) {        setContentView(R.layout.activity_play_video);    }    //初始化surfaceView和mediaplayer    @Override    protected void initView() {        surfaceView = (SurfaceView) findViewById(R.id.surfaceview);        mediaPlayer = new MediaPlayer();    }}

到这里,简单的视频播放功能就全部实现了,这里要注意下视频地址:url:http://1792.vod.myqcloud.com/1792_dfce06fe20b711e692fe0785d455c86c.f40.mp4

0 0