一、引言

我们在开发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自带的控制面板播放网络视频的示意图(自带的控制面板看着有点丑哦):

Android自定义视频播放器(一)相关推荐

  1. Android自定义视频播放器(三)

    参看:Android自定义视频播放器(一):https://blog.csdn.net/zxd1435513775/article/details/81507909 参看:Android自定义视频播放 ...

  2. Android 自定义视频播放器

    由于录像之后,原先选用的腾讯VOD点播播放器显示出来竖屏都变横屏了,虽然选中了现在的腾讯VOD点播,还是把Android视频播放器了解了一番. Android自定义视频播放器有以下三种: 一.Medi ...

  3. Android 自定义视频播放器,可用于以视频做背景的需求

    话不多说,直接上代码: public class BgView extends TextureView implements TextureView.SurfaceTextureListener {p ...

  4. Android进阶:自定义视频播放器开发(下)

    上一篇文章我们主要讲了视频播放器开发之前需要准备的一个知识,TextureView,用于对图像流的处理.这篇文章开始构建一个基础的视频播放器. 一.准备工作 在之前的文章已经说过了,播放器也是一个vi ...

  5. Android开发笔记(一百二十五)自定义视频播放器

    视频播放方式 在Android中播放视频的方式有两种: 1.使用MediaPlayer结合SurfaceView进行播放.其中通过SurfaceView显示视频的画面,通过MediaPlayer来设置 ...

  6. Android进阶:自定义视频播放器开发(上)

    随着快手,抖音,西瓜视频等视频APP的崛起,视频播放已经成为主流,此时作为Android研发的你,想要提高自己的能力还不知道怎么开发视频播放器怎么行?所以今天就带着大家一起开发一个简易播放器:Smal ...

  7. 《android多媒体api》之MediaPlayer自定义视频播放器

    <android多媒体api>系列是整合梳理android开发中经常用到的媒体相关api:多媒体开发主要内容有音频.视频录制播放.摄像头操作.录制操作.流媒体.直播.推流.拉流等方面:最近 ...

  8. Android系列之自定义视频播放器

    Android系列之自定义视频播放器 自述 xml部分 Java对面部分 需要使用到的Animation资源 需要自定义的工具类 自述 自己写的一个简易视频播放器,如果有需要的话欢迎参考和转载,但拒绝 ...

  9. 一步步自定义视频播放器——TextureView+MediaPlayer自定义视频播放器

    本篇参考封装一个视频播放器,原文已经写的非常棒了,本篇加入了个人对其内容的理解.秉承不重复造轮子的良好理念,接下来开始拆解轮子.内容非常多,我都差点放弃写,有耐心的请往下看 github上非常棒的视频 ...

最新文章

  1. Deformable 可变形的DETR
  2. python 2x list 里面的中文打印效果为unicode 编码 的处理方法
  3. Hashtable的使用
  4. CIC滤波器的Matlab仿真与FPGA实现
  5. Symfony2Book06:路由
  6. spring boot 入门_SpringBoot入门建站全系列(三十)Mybatis多数据源进行数据库操作
  7. 特征工程用java或python,机器学习-特征工程-Feature generation 和 Feature selection(示例代码)...
  8. cognito_将Spring Boot应用程序与Amazon Cognito集成
  9. 【更新】深度学习推荐系统
  10. 结构体嵌套结构体c语言,结构体的相互嵌套
  11. 数据结构与算法课程作业--奇数个数的数的查找方法-异或
  12. 代码整洁之道(二)优雅注释之道
  13. mysqldump的一些用法
  14. 省赛来了(组合数)nyoj158
  15. jq实现底部弹框_WPF MVVM 弹框之等待框
  16. 【原创】自制PCB经验教训之一:版图打印篇
  17. ok6410linux开发环境搭建,OK-6410的裸机开发环境配置
  18. App如何在background状态下存活
  19. MAC下解压(.xip)文件
  20. 湖南纬德大宗平台下架了是为什么?还有其他的平台可以操作吗

热门文章

  1. 什么是接口测试?为什么要做接口测试?
  2. 【MSYS2】Windows 无MSVC 安装 MinGW Clang
  3. 22-05-10 西安 mysql基础篇(02) 修改表 、修改列、commit和rollback、表数据之增删改 DML 、列级约束、表级约束
  4. 新加坡中央银行更新了ICO指南
  5. 火绒hipsdaemon.exe占用GPU,导致风扇吵闹,续航下降解决方案(亲测有用,大大增加续航)
  6. Zabbix与ELK整合实现对安全日志数据的实时监控告警
  7. linux 终端打印圣诞树,1021字节javascript写成的3D圣诞树
  8. 基于LED的温度检测(目标检测到--OCR)
  9. webservice文件上传下载
  10. Redis配置成windows服务方法