如何写一个播放器-解析MNVideoPlayer(一)

来源:互联网 发布:主角创造人工智能小说 编辑:程序博客网 时间:2024/06/03 17:43

注:本文适合初学Android或未接触过系统自带的MediaPlayer人群,阅读之前请下载相关代码

MNVideoPlayer代码:http://blog.csdn.net/wenqiang0718/article/details/78615715

在了解MediaPlayer编写之前,让我们参考一下已翻译资料,了解一下它有哪些方法:

主要涉及类:MediaPlayer(1) 当一个MediaPlayer对象被创建或者调用reset()方法之后,它处于空闲状态,调用release()方法后处于结束状态1,一个MediaPlayer对象调用了reset()方法后,再调用其它方法可能会触发OnErrorListener.onError()事件,未调用reset()方法则不会触发2,当Mediaplayer对象不再被使用时,最好调用release()方法对其进行释放,使其处于结束状态,此时它不能被使用3,Mediaplayer对象被创建时(调用构造方法)处于空闲状态,若使用create()方法创建后则处于准备状态。(2) 一般情况下,一些常用的播放控制操作可能因为音频、视频的格式不被支持或者质量较差以及流超时,也有可能由于开发者的疏忽使得Mediaplayer对象处于无效状态等而导致错误。此时可通过注册setOnErrorListener方法实现监控。如果发生了错误,Mediaplayer对象将处于多雾状态,可以使用reset()方法来回复错误。(3) 任何Mediaplayer对象都必须先处于准备状态,然后才开始播放(4) 要开始播放Mediaplayer对象都必须成功调用start()方法,可通过isPlaying()方法来检测是否正在播放(5) 当Mediaplayer对象在播放时,可以进行暂停和停止操作,pause()方法暂停播放,stop()方法停止播放。处于暂停暂停时可通过start()方法恢复播放,但是处于停止状态时则必须先调用prepare()方法使其处于准备状态,再调用start()方法。主要方法:Mediaplayer:构造方法create:        创建一个要播放的多媒体getCurrentPosition:得到当前播放位置getDuration:    得到文件的时间prepare:    准备(同步)prepareAsync:准备(异步)seekTo:        指定播放的位置(以毫秒为单位)setAudioStreamType:    设置流媒体的类型setDataSource:    设置数据来源setDisplay:        设置用SurfaceHolder来显示多媒体setOnBufferingUpdateListener:    网络流媒体的缓冲监听setOnErrorListener:            设置错误信息监听setOnVideoSizeChangedListener:视频尺寸监听setScreenOnWhilePlaying:        设置是否使用SurfaceHolder来显示setVolume:                    设置音量//获取sd卡上的音频文件setDataSource(“/sdcard/test.mp3”);//装载资源中的音乐MediaPlayer.create(Activity01.this,R.raw.test);//目前存在问题,不能循环解析出音频文件原因:.android_secure文件夹受保护,无法获取里面的文件信息播放视频相关类:VideoView方法说明:getBufferPercentage:得到缓冲的百分比getCurrentPosition:得到当前播放位置getDuration:得到视频文件的时间resolveAdjustedSize:调整视频显示大小setMediaController:设置播放控制器模式(播放进度条)setOnCompletionListener:当视频文件播放完时触发事件setVideoPath:设置视频源路径setVideoURI:设置视频源地址 
上述方法及其描述转自博客水漫金山的博客:https://www.cnblogs.com/dyllove98/p/3192090.html

MNVideoPlayer比较方便的地方在于,你可以直接实例化new出来,也可以在layout文件中直接引用,我们以后写控件也尽量做到这一点

<?xml version="1.0" encoding="utf-8"?><LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"    xmlns:app="http://schemas.android.com/apk/res-auto"    android:layout_width="match_parent"    android:layout_height="match_parent"    android:background="#e2e2e2"    android:orientation="vertical">    <com.maning.mnvideoplayerlibrary.player.MNViderPlayer        android:id="@+id/mn_videoplayer"        android:layout_width="match_parent"        android:layout_height="200dp"        android:background="#363636"        app:mnFirstNeedPlay="false" />    <Button        android:layout_width="match_parent"        android:layout_height="wrap_content"        android:layout_margin="10dp"        android:onClick="btn01"        android:text="地址1" />    <Button        android:layout_width="match_parent"        android:layout_height="wrap_content"        android:layout_margin="10dp"        android:onClick="btn02"        android:text="地址2 --- 直接播放指定的位置" />    <Button        android:layout_width="match_parent"        android:layout_height="wrap_content"        android:layout_margin="10dp"        android:onClick="btn03"        android:text="地址3---错误地址" /></LinearLayout>

在MainActivity中进行Player的实例化

mnViderPlayer = (MNViderPlayer) findViewById(R.id.mn_videoplayer);
之后进行Player的相关设置

电量监听(个人感觉没什么必要,但是也有可能产品就需要呢):

mnViderPlayer.setIsNeedBatteryListen(true);
网络监听(这个很重要,后面我们了解了之后,这里可以做各种DIY):

mnViderPlayer.setIsNeedNetChangeListen(true);
设置数据源,通过前面的了解,我们知道MediaPlayer不但支持本地文件,还支持网络文件:

mnViderPlayer.setDataSource(url2, "标题2");
播放完监听(注意:此demo所用的播放结束监听为系统提供的onCompletion方法,但是在一些情况如Error时,也会触发系统的onCompletion方法,所以一定要注意,我自己就没有用系统的方法,但是跟项目中所用的方式方法冲突,所以在后面遇到了相关讲解时我再细致的告诉大家如何优雅的结束视频****很简单,做个定时器,当播放时间等于总时间时,延时一秒结束即可):

 //播放完成监听        mnViderPlayer.setOnCompletionListener(new MNViderPlayer.OnCompletionListener() {            @Override            public void onCompletion(MediaPlayer mediaPlayer) {                Log.i(TAG, "播放完成----");            }        });

此demo视频暂停放在了系统的onPause方法中:

@Override    protected void onPause() {        super.onPause();        mnViderPlayer.pauseVideo();    }
视频销毁:

@Override    protected void onDestroy() {        //一定要记得销毁View        if(mnViderPlayer != null){            mnViderPlayer.destroyVideo();            mnViderPlayer = null;        }        super.onDestroy();    }

OK,MainActivity中的相关引用就这样,非常简单,我们前期了解到这里就可以,但是在实际项目中并没有这么简单,下一章我将为大家详细的解析MNVideoPlayer的源代码以及其中哪些地方容易遇到兼容性问题,以及类似播放结束这种不容易碰到的内部问题。

阅读全文
0 0
原创粉丝点击