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

注:本文适合初学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的源代码以及其中哪些地方容易遇到兼容性问题,以及类似播放结束这种不容易碰到的内部问题。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值