Android自身的播放控件在界面定制上不是很方便,而且没有针对播放流进行加工处理的相关接口。于是自己写了一个基于MediaPlayer的播放器控件。该控件有以下特点:

  1. 支持开发者对播放界面进行任意的定制。
  2. 支持开发者对播放流进行加工处理,比如加解密等。
  3. 支持开发者进行插件开发。
  4. 自带了三个插件:外挂字幕插件,图片广告插件和弹幕插件

效果图

一、项目结构

二、播放器控件图层结构

  1. 播放器View图层结构:

    最外层为PineMediaPlayerView,由下往上依次为:
    a). 播放器画面的surfaceview,位于最底层。
    b). PineMediaController View,覆盖于播放器surfaceview之上。

  2. 播放器控件PineMediaController图层结构:

    控制器控件界面由下往上依次为:
    a). 背景view,位于PineMediaController底层。
    b). 各类插件View:广告,外挂字幕,弹幕等,覆盖于背景View之上。
    c). 内置控制器View,覆盖于插件View之上。
    d). 加载等待View,覆盖于内置控制器View之上。
    e). 右侧View,覆盖于加载等待View之上。
    具体可参考PineMediaController的attachToParentView方法中添加各个View的顺序。

  3. 播放器插件Plugin View图层结构:

    由下往上依次为:
    a). 宽高与播放画面SurfaceView相同的插件View,比如自带的外挂字幕插件。

    b). 宽高与PineMediaController相同的插件View,比如自带的图片广告插件。

资料领取直通车:音视频开发&流媒体服务器资料文档+视频教程

音视频学习直通车:【免费】FFmpeg/WebRTC/RTMP/NDK/Android音视频流媒体高级开发

三、类结构

  1. 组件类图

    PineSurfaceView为播放画面的surface view,PineMediaController是控制器界面管理类,管理控制器界面。PineMediaPlayerView则是控件的最外层View,surface view和控制器View都是其子View,其中控制器View 覆盖在surface view上面。
    a). PineMediaPlayerView,PineMediaController,PineSurfaceView为界面View。
    b). PineMediaPlayerComponent封装具体的播放器(本项目封装的是MediaPlayer),通过代理PineMediaPlayerProxy与界面进行交互。

  2. 控件适配类图

    开发者通过实现PineMediaController.AbstractMediaControllerAdapter来进行适配:
    a). onCreateBackgroundViewHolder:背景View定制,返回PineBackgroundViewHolder给播放器控件,该View会通过attachToParentView加入到控件中。
    b). onCreateInRootControllerViewHolder:内置控制器View定制,返回PineControllerViewHolder给播放器控件,该View会通过attachToParentView加入到控件中。
    c). onCreateOutRootControllerViewHolder:外置控制器View,返回PineControllerViewHolder给播放器控件,该View不会加入到控件中,而由用户自己指定显示的位置,但依然需生成PineControllerViewHolder给播放器,使得播放器播放行为与该View相关联。
    d). onCreateWaitingProgressViewHolder:加载等待View定制,返回PineWaitingProgressViewHolder给播放器控件,该View会通过attachToParentView加入到控件中。
    e). onCreateRightViewHolderList:全屏下的右侧View定制,返回PineRightViewHolder列表给播放器控件,该View List会通过attachToParentView加入到控件中(主要应用有播放列表View,清晰度列表View等)。
    f). onCreateControllerMonitor:返回界面更新适配器ControllerMonitor。
    g). onCreateControllersActionListener:返回点击及手势事件适配器接口IControllersActionListener。
    适配分两类:
    a). 界面适配:onCreateXXXViewholder
    b). 事件适配,事件适配又分两类:
    界面更新事件适配-onCreateControllerMonitor;
    点击及手势事件适配-onCreateControllersActionListener。

  3. 插件类图

    插件使得开发者可以对控件进行界面和功能性的扩展。开发者通过实现IPinePlayerPlugin接口来定制自己的功能。该接口主要的API
    a). onInit:用于插件初始化。
    b). createViewHolder:插件界面的创建。
    c). getContainerType:插件界面宽高匹配类别,TYPE_MATCH_CONTROLLER-与控制器界面的宽高相同,TYPE_MATCH_SURFACE-与surface view的宽高相同。
    d). onMediaPlayerXXX:播放器播放状态回调。
    e). onTime:播放器播放时间间隔(每200毫秒回调一次)回调。
    f). onRelease:播放器释放后回调。

本demo内置了三个插件:外挂字幕插件,图片广告插件和弹幕插件,开发者可以参考这三个插件来定制自己的插件。

四、常用的API说明

  1. PineMediaPlayerView:
/**
* 播放器控件初始化
* @param mediaPlayerTag   播放器唯一标识,如果mediaPlayerTag标识的播放器已经初始化,
*                         则将控件绑定到该播放器上,否则初始化一个新的mediaPlayerTag标识的播放器,
*                         并绑定控件到播放器上。
* @param controller   IPineMediaController 实例,即播放器控制器
* @param enableSurface   是否需要SurfaceView来呈现播放画面(默认为true),对于音频则可以设置为false
* @param saveMediaStateWhenHide   当控件View隐藏时(比如控件所在Activity被pause,或者失去焦点)是否自动保存当前播放状态,
*                                 用于再次显示之后的恢复到之前的播放状态(默认为true)。
*/
void init(String mediaPlayerTag, PineMediaWidget.IPineMediaController controller,boolean enableSurface, boolean saveMediaStateWhenHide);/**
* 获取播放器控件绑定的播放器接口
*/
PineMediaWidget.IPineMediaPlayer getMediaPlayer()
  1. IPineMediaPlayer
/**
* 开始播放
*/
void start();/**
* 暂停播放
*/
void pause();/**
* 恢复播放
*/
void resume();/**
* 设置多媒体播放参数
*
* @param pineMediaPlayerBean 多媒体播放参数对象
*/
void setPlayingMedia(PineMediaPlayerBean pineMediaPlayerBean);/**
* 保存播放状态和进度
*/
void savePlayMediaState();/**
* 设置是否为独立播放模式(是否与播放界面共生命周期)
*
* @param isAutocephalyPlayMode 设置是否为独立播放模式
* @param shouldDestroyWhenDetach   在非独立模式下,当控件View从上下文环境中(Context)移除时,
*                            播放器是销毁(destroy)还是释放(release)
* true: destroy模式下,从Context中移除后,非独立播放器所有状态清除,对象销毁,无法使用resume来恢复播放状态
* false: release模式下,从Context中移除后,非独立播放器所有状态清除,对象不会销毁,可以使用resume来恢复播放状态
*/
void setAutocephalyPlayMode(boolean isAutocephalyPlayMode, boolean destroyWhenDetach);

更多API请参考PineMediaWidget.IPineMediaPlayer接口

  1. PineMediaController
/**
* 设置播放器控制器适配器(自定义自己的播放器控制器界面及显示方式)
*
* @param adapter 适配器
*/
void setMediaControllerAdapter(AbstractMediaControllerAdapter adapter)
  1. AbstractMediaControllerAdapter
/**
* 适配器初始化
*
* @param player
* @return
*/
protected boolean init(PineMediaWidget.IPineMediaPlayer player) {return true;
}/**
* 背景布局,会被添加到PineMediaPlayerView布局中,
* 位于PineMediaController View最底层。用于播放切换过程中的背景布置,或者播放音频时的背景图
*
* @param player
* @param isFullScreenMode
* @return
*/
protected abstract PineBackgroundViewHolder onCreateBackgroundViewHolder(PineMediaWidget.IPineMediaPlayer player, boolean isFullScreenMode);/**
* Controller内置控件布局的view holder,会被添加到PineMediaPlayerView布局中,
* 与onCreateOutRootControllerViewHolder互斥,优先使用OutRoot布局。
* 覆盖在BackgroundView上,请使用透明背景
* 需要在该方法中绑定布局的相应控件到ViewHolder中,对应的控件功能才能被激活
*
* @param player
* @param isFullScreenMode
* @return
*/
protected abstract PineControllerViewHolder onCreateInRootControllerViewHolder(PineMediaWidget.IPineMediaPlayer player, boolean isFullScreenMode);/**
* Controller外置控件布局的view holder,不会被添加到PineMediaPlayerView布局中,
* 与onCreateInRootControllerViewHolder互斥,优先使用OutRoot布局。
* 需要在该方法中绑定布局的相应控件到ViewHolder中,对应的控件功能才能被激活
*
* @param player
* @param isFullScreenMode
* @return
*/
protected abstract PineControllerViewHolder onCreateOutRootControllerViewHolder(PineMediaWidget.IPineMediaPlayer player, boolean isFullScreenMode);/**
* 播放准备过程中的等待界面的view holder,会被添加到PineMediaPlayerView布局中,
* 覆盖在ControllerView上
*
* @param player
* @param isFullScreenMode
* @return
*/
protected abstract PineWaitingProgressViewHolder onCreateWaitingProgressViewHolder(PineMediaWidget.IPineMediaPlayer player, boolean isFullScreenMode);/**
* 内置的右侧view holder List,会被添加到PineMediaPlayerView布局中,
* 覆盖在WaitingProgressView上
*
* @param player
* @param isFullScreenMode
* @return
*/
protected abstract List<PineRightViewHolder> onCreateRightViewHolderList(PineMediaWidget.IPineMediaPlayer player, boolean isFullScreenMode);/**
* Controller各个显示部件及显示状态更新回调器
*
* @return
*/
protected ControllerMonitor onCreateControllerMonitor() {return new ControllerMonitor();
}/**
* Controller各个控制部件的事件的listener
*
* @return
*/
protected ControllersActionListener onCreateControllersActionListener() {return new ControllersActionListener();
}/**
* 设置当前播放媒体在播放列表中的位置
*
* @param position
*/
public void setCurrentMediaPosition(int position) {}

基于MediaPlayer的Android播放器控件相关推荐

  1. Android自定义一个播放器控件

    介绍 最近要使用播放器做一个简单的视频播放功能,开始学习VideoView,在横竖屏切换的时候碰到了点麻烦,不过在查阅资料后总算是解决了.在写VideoView播放视频时候定义控制的代码全写在Actv ...

  2. VS2010/MFC对话框程序调用Windows Media Player播放器控件

    MFC对话框程序调用Windows Media Player播放器控件播放打开的avi格式的文件,具体步骤如下: 1.根据MFC向导提示,创建一个默认的对话框项目TestMediaPlayer. 2. ...

  3. PPT中WMP播放器控件的使用方法

    Windows Media Player是个十分好用的播放器,它支持多个格式视频.音频文件的播放,在PPT 2003中使用的频率非常的高. 本文以PPT 2003为例,讲解一下PPT 2003中WMP ...

  4. android播放视频控件,视频播放控件VideoView的基本使用

    在Android的界面控件中有一个视频播放控件,可以直接在手机上面开辟一个视频播放的UI,播放视频,下面ATAAW.COM大概介绍下视频控件VideoView的使用,由于视频播放是属于Android多 ...

  5. 使用videjs+vue2+elementui自定义播放器控件

    一.安装项目所需依赖 videojs依赖: npm install --save-dev video.js elementui依赖(这个图方便就不按需引入了): npm i element-ui -S ...

  6. vlc集成c#_C# Winform开发程序调用VLC播放器控件播放视频.

    VLC是个好东西,支持的格式多,还无广告,关键还有调用它的播放控件不用安装. 开个文章记录下调用这个控件的流水账,以便以后需要的时候查阅 创建工程 首先新建一个Winform工程. 这里姑且叫做VLC ...

  7. HTML如何设置音频播放器控件的大小

    如下所示: <object height="100" width="100" data="../i/horse.mp3"> &l ...

  8. 微信小程序 - 页面背景音乐播放器控件(音乐盒图标旋转 360° 动画且可点击暂停与播放)

    前言 因为无法插入视频,您所看到的是效果图(实则控制音乐),运行起来 有背景音乐. 默认直接播放音乐,用户可点击暂停与继续播放, 除了基础功能,也做好了播放.暂停.出错等监听,由您根据业务进行扩展. ...

  9. Delphi 媒体播放器控件

    樊伟胜 转载于:https://www.cnblogs.com/fanweisheng/p/11378752.html

最新文章

  1. jasp报错_jetty启动访问jsp页面报错
  2. 智能指针_auto_ptr2_学习笔记
  3. GitHub 开源的 MySQL 在线更改 Schema 工具【转】
  4. 【Scratch】青少年蓝桥杯_每日一题_5.01_画三五七边型
  5. 纯ajax html网页,JavaScript – 页面加载纯HTML AJAX网站中的替代品
  6. eureka动态扩容_SpringCloud- 第二篇 Eureka快速上手
  7. Community Server Resources
  8. Adaptive Platform AUTOSAR(AP)平台的四个基本概念
  9. 数据--第35课 - 创建二叉树
  10. saga中的saga(A Saga on Sagas) - balavatasky - 博客园
  11. 计算机视觉专业名词中英文对照(转)
  12. 计算机网络水晶头闪,网线水晶头坏了怎么办 小妙招一分钟解决你的问题
  13. 2022美团校招技术岗笔试全部AC_Code分享
  14. Openlayer 切换鼠标样式
  15. html 整个页面淡入浅出,css3网页的淡入淡出效果
  16. 分水岭算法 c语言实现,分水岭算法的应用
  17. 个人怎么创建微信公众号?
  18. property属性的使用
  19. 开源框架XWIKI搭建介绍
  20. 全同态加密:FHEW

热门文章

  1. Echarts实现多个x轴或y轴曲线图
  2. SNMP协议以及著名的MIB详解
  3. C# winform跨线程操作控件
  4. java获取b站动态列表地址,java获取B站弹幕文件的两种方案
  5. 如何控制CentOS8的启动过程
  6. 微信小程序for循环
  7. NG_ML_Cousera_Summary
  8. vue全家桶+koa2+mongoDB打造全栈社区博客
  9. Java使用模板导出带图片word文档
  10. 在服务器上设置虚拟传入,如何配置 SMTP 虚拟服务器以进行邮件传递