Android自定义视频播放器(一)

版权声明:本文为博主原创文章,未经博主允许不得转载。 https://blog.csdn.net/zxd1435513775/article/details/81507909

一、引言

我们在开发Android多媒体应用时,有两种方式来播放多媒体资源。第一种是使用隐式的Intent,来使用系统或者手机已经安装的第三方播放器应用来播放音视频,第二种是使用Android自带的、我们自定义的播放器来播放,这种主要是采用Android提供的MediaPlayer和VideoView来播放多媒体文件,下面会逐一讲述。两种方式的代码如下:

//隐式方式,使用第三方播放器
 Intent intent = new Intent();      
 String url = "" 
 intent.setDataAndType(Uri.parse(url),"video/*");
 startActivity(intent);

//调用自定义播放器
Intent intent = new Intent(context,VideoActivity.class);
startActivity(intent);

对于自定义播放器,需要在VideoActivity的布局文件中,加入VideoView的定义,然后在VideoActivity中获取,并使用:

setContentView(R.layout.activity_video);
videoView = findViewById(R.id.mVideoView);
//设置播放地址
videoView.setVideoPath(url);
//设置准备好了的监听
videoView.setOnPreparedListener(new MyPreparedListener());
videoView.setOnErrorListener(new MyErrorListener());
videoView.setOnCompletionListener(new MyCompletionListener());
//为VideoView添加控制面板,用于暂停和播放
videoView.setMediaController(new MediaController(this));

二、MediaPlay

1、MediaPlayer,它主要是和虚拟机的底层进行打交道,包括下面要讲的VideoView也是对它的封装和调用。

2、MediaPlayer,封装了很多播放音视频的方法,如: start、pause、stop。(下图部分方法)
这里写图片描述

3、MediaPlayer,可以播放本地和网络的音视频,播放网络资源的时候,要联网权限。

4、MediaPlayer,可以支持的视频格式:mp4、3gp、.m3u8(多用于直播)、直接用pc的.mp4文件等

5、执行流程:
这里写图片描述
6、各状态说明:

  • 状态1:Idel(空闲)状态
    当 mediaplayer创建或者执行reset()方法后处于这个状态。
  • 状态2:Initialized(已初始化)状态
    当调用mediaplayer的setDataResource()方法给mediaplayer设置播放的数据源后,mediaplayer会处于该状态。
  • 状态3:Prepared(准备就续)状态
    设置完数据源后,调用mediaplayer的prepare()方法,让mediaplayer准备播放。值得一提的是,这里除了prepare()方法,还有prepareAsnyc()方法,此方法是异步方法,一般用于网络视频的缓冲。当缓冲完毕后,就会触发准备完毕的事件。我们要做的就是监听该事件(OnPreparedListener),当缓冲完成时,执行相应的操作。在此状态上,我们可以调用seekTo()方法定位视频,此方法不改变mediaplayer的状态;亦可调用stop()放弃视频播放,使mediaplayer处于Stopped状态。一般我们会在此状态上调用start()方法开始播放视频。
  • 状态4:Started(开始)状态
    当处于Prepared状态、Paused状态和PlayebackCompeleted状态时,调用Started()方法即可进入该状态。在该状态中,mediaplayer开始播放视频,可以通过seekTo()方法和start()方法改变视频播放的进度,当Looping为真且播放完毕后,它会重新开始播放(即循环播放);否则播放完毕后,会触发事件并调用OnCompletionaListener.OnCompletion()方法,进行特定操作,并进入PlaybackCompleted状态。在此状态中,亦可调用pause()方法或者stop()方法让视频暂停或停止,此时mediaplayer分别处于Stopped和Paused状态。
  • 状态5:Stopped(停止)状态
    当 mediaplayer处于Prepared、Started、Paused、PlaybackCompleted状态时,调用stop()方法即可进入本状态。应特别注意的是,在本状态中,若想重新开始播放,不能直接调用start()方法,必须调用prepare()方法或prepareAsync()方法重新让mediaplayer处于Prepared状态方可调用start()方法播放视频。
  • 状态6:Paused(暂停)状态
    当mediaplayer处于Started状态是,调用pause()方法即可进入本状态。在本状态里,可直接调用start()方法使,mediaplayer回到Started状态,亦可调用stop()方法停止视频播放,让播放器处于停止态。
  • 状态7:PlaybackCompleted(播放完成)状态
    当mediaplayer播放完成且Looping为假时即可进入本状态。在本状态可调用start()方法使mediaplayer回到Started状态(注意此时是从头开始播放);亦可调用stop()方法使mediaplayer处于停止态,结束播放。
  • 状态8:Error(错误)状态
    当mediaplayer出现错误时处于此状态。

三、VideoView

1、VideoView,用于显示视频,继承SurfaceView类,实现MediaPlayerControl接口。

2、封装了MediaPlayer的start、pause、stop,本质上是对MediaPlayer的调用。(如:pause()方法是对MediaPlayer的调用)
这里写图片描述
3、SurfaceView,默认使用双缓冲技术,它支持在子线程中绘制图像,这样就不会阻塞主线程了,所以它更适合于游戏和视频播放器的开发。

4、实现MediaPlayerControl接口,便于控制面板调用VideoView的方法

 public interface MediaPlayerControl {
        void    start();
        void    pause();
        int     getDuration();
        int     getCurrentPosition();
        void    seekTo(int pos);
        boolean isPlaying();
        int     getBufferPercentage();
        boolean canPause();
        boolean canSeekBackward();
        boolean canSeekForward();
        int     getAudioSessionId();
    }

videoview.setMediaController(new MediaController(this));

四、Activity的生命周期和横竖屏切换的生命周期

Activity的生命周期流程图
这里写图片描述

1、正常创建一个Activity执行的方法
onCreate-->onStart-->onResume
2、正常销毁一个Activity执行的方法
onPause-->onStop->onDestroy
3、A页面跳转到B页面,点击返回,这个过程中的生命周期
(1)、B页面完全覆盖A页面的情况
A跳转B页面的生命周期方法执行顺序:
onPause(A)->onCreate(B)--->onStart(B)--->onResume(B)--->onStop(A)
B页面点击后返回生命周期执行顺序:
onPause(B)-->onRestart(A)-->onStart(A)-->onResume(A)->onStop(B)-->onDestroy(B)
(2)、B页面不完全覆盖A页面的请求
A跳转B页面的生命周期方法执行顺序
onPause(A)-->onCreate(B)-->onStart(B)-->onResume(B)
B页面点击后返回生命周期执行顺序
onPause(B)-->onResume(A)-->->onStop(B)-->onDestroy(B)
4、Activity横竖屏切换的生命周期
(1)、默认情况,屏幕横竖屏切换会让Activity的生命周期重新执行:
onPause-->onStop-->onDestroy-->onCreate-->onStart-->onResume
(2)、在Manifest文件中,相应的Activity配置如下,不会让生命周期重新执行:
onPause-->onStop-->onDestroy

<activity android:name=".activity.VideoActivity"
        android:configChanges="keyboardHidden|screenSize|orientation"
        />

五、总结

1、其实想用VideoView播放视频很简单,只需要在布局文件里,定义一个VideoView,然后在Activity中获取到,设置播放地址,并为VideoView绑定几个监听器,就可以进行对视频的播放了。
2、对于播放视频的地址,可以分为:

 - 本地资源(我理解为只属于这个应用的)
 - Internal URIs, 比如可以通过 Content Resolver 获得的
 - External URLs (流媒体)

对于视频具体的操作,可以参考Android的文档:
http://www.android-doc.com/guide/topics/media/mediaplayer.html

3、下图为使用VideoView自带的控制面板播放网络视频的示意图(自带的控制面板看着有点丑哦):
这里写图片描述

猜你喜欢

转载自blog.csdn.net/zxd1435513775/article/details/81507909