android视频播放器api,03.视频播放器Api说明

03.视频播放器Api说明

目录介绍01.最简单的播放

02.如何切换视频内核

03.切换视频模式

04.切换视频清晰度

05.视频播放监听

06.列表中播放处理

07.悬浮窗口播放

08.其他重要功能Api

09.播放多个视频

10.VideoPlayer相关Api

11.Controller相关Api

12.边播放边缓存api

13.类似抖音视频预加载

14.视频播放器埋点

00.视频播放器通用框架基础封装视频播放器player,可以在ExoPlayer、MediaPlayer,声网RTC视频播放器内核,原生MediaPlayer可以自由切换

对于视图状态切换和后期维护拓展,避免功能和业务出现耦合。比如需要支持播放器UI高度定制,而不是该lib库中UI代码

针对视频播放,音频播放,播放回放,以及视频直播的功能。使用简单,代码拓展性强,封装性好,主要是和业务彻底解耦,暴露接口监听给开发者处理业务具体逻辑

该播放器整体架构:播放器内核(自由切换) + 视频播放器 + 边播边缓存 + 高度定制播放器UI视图层

01.最简单的播放必须需要的四步骤代码如下所示//创建基础视频播放器,一般播放器的功能 BasisVideoController controller = new BasisVideoController(this); //设置控制器 mVideoPlayer.setVideoController(controller); //设置视频播放链接地址 mVideoPlayer.setUrl(url); //开始播放 mVideoPlayer.start(); ```- 开始播放

//播放视频 videoPlayer.start(); `

02.如何切换视频内核创建视频播放器PlayerFactory playerFactory = IjkPlayerFactory.create(); IjkVideoPlayer ijkVideoPlayer = (IjkVideoPlayer) playerFactory.createPlayer(this); PlayerFactory playerFactory = ExoPlayerFactory.create(); ExoMediaPlayer exoMediaPlayer = (ExoMediaPlayer) playerFactory.createPlayer(this); PlayerFactory playerFactory = MediaPlayerFactory.create(); AndroidMediaPlayer androidMediaPlayer = (AndroidMediaPlayer) playerFactory.createPlayer(this); ```- 如何配置视频内核

//播放器配置,注意:此为全局配置,例如下面就是配置ijk内核播放器 VideoViewManager.setConfig(VideoPlayerConfig.newBuilder() .setLogEnabled(true)//调试的时候请打开日志,方便排错 .setPlayerFactory(IjkPlayerFactory.create()) .build()); `- 切换视频内核处理代码

03.切换视频模式关于全屏模式相关api//进入全屏 mVideoPlayer.startFullScreen(); //退出全屏 mVideoPlayer.stopFullScreen(); ```- 关于小窗口播放相关api

//开启小屏 mVideoPlayer.startTinyScreen(); //退出小屏 mVideoPlayer.stopTinyScreen(); `

04.切换视频清晰度

05.视频播放监听这个分为两部分:第一部分是播放模式监听,第二部分是播放状态监听,暴露给开发者。这里不建议使用0,1,非常不方便简明之意,采用注解限定。mVideoPlayer.setOnStateChangeListener(new OnVideoStateListener() { /** * 播放模式 * 普通模式,小窗口模式,正常模式三种其中一种 * MODE_NORMAL 普通模式 * MODE_FULL_SCREEN 全屏模式 * MODE_TINY_WINDOW 小屏模式 * @param playerState 播放模式 */ @Override public void onPlayerStateChanged(int playerState) { switch (playerState) { case ConstantKeys.PlayMode.MODE_NORMAL: //普通模式 break; case ConstantKeys.PlayMode.MODE_FULL_SCREEN: //全屏模式 break; case ConstantKeys.PlayMode.MODE_TINY_WINDOW: //小屏模式 break; } } /**

06.在列表中播放第一步:初始化视频播放器,创建VideoPlayer对象mVideoView = new VideoPlayer(context); mVideoView.setOnStateChangeListener(new VideoPlayer.SimpleOnStateChangeListener() { @Override public void onPlayStateChanged(int playState) { //监听VideoViewManager释放,重置状态 if (playState == ConstantKeys.CurrentState.STATE_IDLE) { PlayerUtils.removeViewFormParent(mVideoView); mLastPos = mCurPos; mCurPos = -1; } } }); mController = new BasisVideoController(context); mVideoView.setController(mController); ```- 第二步:设置RecyclerView和Adapter

mAdapter.setOnItemChildClickListener(new OnItemChildClickListener() { @Override public void onItemChildClick(int position) { //点击item播放视频 startPlay(position); } }); mRecyclerView.addOnChildAttachStateChangeListener(new RecyclerView.OnChildAttachStateChangeListener() { @Override public void onChildViewAttachedToWindow(@NonNull View view) { }@Override

public void onChildViewDetachedFromWindow(@NonNull View view) { FrameLayout playerContainer = view.findViewById(R.id.player_container); View v = playerContainer.getChildAt(0); if (v != null && v == mVideoView && !mVideoView.isFullScreen()) { //销毁视频 releaseVideoView(); } } }); `- 第三步:播放视频和销毁视频的逻辑代码/** * 开始播放 * @param position 列表位置 */ protected void startPlay(int position) { if (mCurPos == position) return; if (mCurPos != -1) { releaseVideoView(); } VideoInfoBean videoBean = mVideos.get(position); mVideoView.setUrl(videoBean.getVideoUrl()); View itemView = mLinearLayoutManager.findViewByPosition(position); if (itemView == null) return; VideoRecyclerViewAdapter.VideoHolder viewHolder = (VideoRecyclerViewAdapter.VideoHolder) itemView.getTag(); //把列表中预置的PrepareView添加到控制器中,注意isPrivate此处只能为true。 mController.addControlComponent(viewHolder.mPrepareView, true); PlayerUtils.removeViewFormParent(mVideoView); viewHolder.mPlayerContainer.addView(mVideoView, 0); //播放之前将VideoView添加到VideoViewManager以便在别的页面也能操作它 VideoViewManager.instance().add(mVideoView, "list"); mVideoView.start(); mCurPos = position; } private void releaseVideoView() {

08.其他重要功能Api设置视频播放器背景图,和视频标题。//注意,下面这个controller是指BasisVideoController //设置视频背景图 ImageView thumb = controller.getThumb(); Glide.with(this).load(R.drawable.image_default).into(controller.getThumb()); //设置视频标题 controller.setTitle("视频标题"); ```- 判断是否锁屏

//判断是否锁屏 boolean locked = controller.isLocked(); //设置是否锁屏 controller.setLocked(true); `- 设置播放视频缩放类型。借鉴于网络博客,类似图片缩放。建议选择16:9类型,最常见

09.播放多个视频这个举一个例子,比如同时播放两个视频,当然这种情况在app中可能比较少//必须设置 player1.setUrl(VOD_URL_1); VideoPlayerBuilder.Builder builder = VideoPlayerBuilder.newBuilder(); builder.setEnableAudioFocus(false); VideoPlayerBuilder videoPlayerBuilder = new VideoPlayerBuilder(builder); player1.setVideoBuilder(videoPlayerBuilder); BasisVideoController controller1 = new BasisVideoController(this); player1.setController(controller1); mVideoViews.add(player1); //必须设置

player2.setUrl(VOD_URL_2); VideoPlayerBuilder.Builder builder2 = VideoPlayerBuilder.newBuilder(); builder.setEnableAudioFocus(false); VideoPlayerBuilder videoPlayerBuilder2 = new VideoPlayerBuilder(builder2); player2.setVideoBuilder(videoPlayerBuilder2); BasisVideoController controller2 = new BasisVideoController(this); player2.setController(controller2); mVideoViews.add(player2); ```- 那么要是页面切换到后台,如何处理多个视频的暂停功能呢?如下所示:

@Override protected void onPause() { super.onPause(); for (VideoPlayer vv : mVideoViews) { vv.pause(); } } @Override

protected void onResume() { super.onResume(); for (VideoPlayer vv : mVideoViews) { vv.pause(); } } @Override

protected void onDestroy() { super.onDestroy(); for (VideoPlayer vv : mVideoViews) { vv.release(); } } @Override

public void onBackPressed() { for (VideoPlayer vv : mVideoViews) { if (vv.onBackPressed()) return; } super.onBackPressed(); } `

10.VideoPlayer相关Api关于视频播放相关的api如下所示//暂停播放 mVideoPlayer.pause(); //视频缓冲完毕,准备开始播放时回调 mVideoPlayer.onPrepared(); //重新播放 mVideoPlayer.replay(true); //继续播放 mVideoPlayer.resume(); //调整播放进度 mVideoPlayer.seekTo(100); //循环播放, 默认不循环播放 mVideoPlayer.setLooping(true); //设置播放速度 mVideoPlayer.setSpeed(1.1f); //设置音量 0.0f-1.0f 之间 mVideoPlayer.setVolume(1,1); //开始播放 mVideoPlayer.start(); ```- 关于视频切换播放模式相关api

//判断是否处于全屏状态 boolean fullScreen = mVideoPlayer.isFullScreen(); //是否是小窗口模式 boolean tinyScreen = mVideoPlayer.isTinyScreen(); //进入全屏 mVideoPlayer.startFullScreen(); //退出全屏 mVideoPlayer.stopFullScreen(); //开启小屏 mVideoPlayer.startTinyScreen(); //退出小屏 mVideoPlayer.stopTinyScreen(); `- 关于其他比如获取速度,音量,设置属性相关Api

11.Controller相关ApiController控制器相关的Api说明

12.边播放边缓存api如下所示

13.类似抖音视频预加载如下所示,这个是针对ViewPager//获取PreloadManager预加载管理者对象 mPreloadManager = PreloadManager.getInstance(this); //在播放视频的时候 String playUrl = mPreloadManager.getPlayUrl(url); VideoLogUtils.i("startPlay: " + "position: " + position + " url: " + playUrl); mVideoPlayer.setUrl(playUrl); //在页面滚动的时候 mViewPager.setOnPageChangeListener(new ViewPager.SimpleOnPageChangeListener() { @Override public void onPageScrollStateChanged(int state) { super.onPageScrollStateChanged(state); if (state == VerticalViewPager.SCROLL_STATE_IDLE) { mPreloadManager.resumePreload(mCurPos, mIsReverseScroll); } else { mPreloadManager.pausePreload(mCurPos, mIsReverseScroll); } } }); ```- 如下所示,这个是针对RecyclerView

recyclerView.addOnScrollListener(new RecyclerView.OnScrollListener() { /* 是否反向滑动 */ private boolean mIsReverseScroll; @Override

public void onScrolled(@NonNull RecyclerView recyclerView, int dx, int dy) { super.onScrolled(recyclerView, dx, dy); if (dy>0){ //表示下滑 mIsReverseScroll = false; } else { //表示上滑 mIsReverseScroll = true; } } @Override

public void onScrollStateChanged(@NonNull RecyclerView recyclerView, int newState) { super.onScrollStateChanged(recyclerView, newState); if (newState == VerticalViewPager.SCROLL_STATE_IDLE) { mPreloadManager.resumePreload(mCurPos, mIsReverseScroll); } else { mPreloadManager.pausePreload(mCurPos, mIsReverseScroll); } } }); `

14.视频播放器埋点代码如下所示,写一个类,实现BuriedPointEvent即可。即可埋点视频的播放次数,播放进度,点击视频广告啥的,方便统一管理public class BuriedPointEventImpl implements BuriedPointEvent {

/** * 进入视频播放 * @param url 视频url */ @Override public void playerIn(String url) {

} /**

* 退出视频播放 * @param url 视频url */ @Override public void playerDestroy(String url) {

}

/** * 视频播放完成 * @param url 视频url */ @Override public void playerCompletion(String url) {

}

/** * 视频播放异常 * @param url 视频url * @param isNetError 是否是网络异常 */ @Override public void onError(String url, boolean isNetError) {

}

/** * 点击了视频广告 * @param url 视频url */ @Override public void clickAd(String url) {

}

/** * 退出视频播放时候的播放进度百度分 * @param url 视频url * @param progress 视频进度,计算百分比【退出时候进度 / 总进度】 */ @Override public void playerOutProgress(String url, float progress) {

}

/** * 视频切换音频 * @param url 视频url */ @Override public void videoToMedia(String url) {

}}

15.播放器示例展示图

1460000037479524

1460000037479526

1460000037479527

1460000037479527

1460000037479529

1460000037479530

1460000037479531

1460000037479534

1460000037479532

1460000037479533

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/397404.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

使用Python重命名MP3标签

从Window复制MP3文件的到Ubuntu下,MP3标签很多是乱码。于是想自己写个Python程序处理一下。 从酷狗复制过来的音乐文件名都是“作者 - 标题”,所以可以通过解析文件名直接获取作者和标题信息。 需要下载eyeD3模块 $ sudo apt-get install python-eyed3 代…

Taurus.MVC 2.0 开源发布:WebAPI开发教程

背景: 有用户反映,Tausus.MVC 能写WebAPI么? 能! 教程呢? 嗯,木有! 好吧,刚好2.0出来,就带上WEBAPI教程了! 开源地址: https://github.com/cyq116…

android 锁屏 home,android 锁屏界面禁用长按home 和menu(recent apps)

android 5.1 系统中public long interceptKeyBeforeDispatching(WindowState win, KeyEvent event, int policyFlags) {//检查当前是否锁屏, 可以添加getTopApp()判断当前activity 来屏蔽2398 final boolean keyguardOn keyguardOn();添加新的方法://获…

Chrome浏览器调试踩坑

Chrome浏览器若在响应式状态下,页面缩放比例不是100%,元素会“窜位”,点击元素会点击到元素周围的元素 Chrome页面缩放比例不为100%时,table的单元格就算没有边框(CSS去掉了)也会显示出边框(缝隙…

WordPress 博客文章时间格式the_time()设置

国外设计的WordPress 主题里的文章的时间格式是类似“十一月 21, 2010”这种格式的,而中国人习惯的是年在前,月紧跟其后,日在末尾,所以看国外的就显得很别扭,但是我们可以通过修改WP时间代码来设置成为我们中国人习惯的…

linux yum

更改linux YUM源方法:第一步:进入yum配置文件目录:cd /etc/yum.repos.d/第二步:备份配置文件:mv CentOS-Base.repo CentOS-Base.repo.bak第三步:下载网易的配置(或其他源配置文件)&a…

chrome瀏覽器去掉緩存的方法

方法一: 1.開發說打開開發者工具 勾選這個訪問可以 方法二: commandshiftR 转载于:https://www.cnblogs.com/kaibindirver/p/9378572.html

Apache Tomcat目录下各个文件夹的作用

1.bin:存放各种不同平台开启与关闭Tomcat的脚本文件。 2.lib:存tomcat与web应用的Jar包。 3.conf:存放tomcat的配置文件。 4.webapps:web应用的发布目录。 5.work:tomcat把由各种jsp生成的servlet文件存放的地方。 6.l…

sony z2 android 5.0,索尼Xperia Z2 5.0 root教程_索尼Z2获取5.0系统的root

来说一下咱们的索尼Xperia Z2手机的5.0系统的root,因为现在很多机友的系统是5.0的,可是对于5.0的系统很多机友还不知道如何进行root操作,之前的针对4.4的系统的root方法肯定是用不到5.0的系统上的,因此需要专门的针对5.0的root软件…

ABP文档 - Javascript Api - AJAX

本节内容: AJAX操作相关问题ABP的方式 AJAX 返回信息处理错误 HTTP 状态码WrapResult和DontWrapResult特性 Asp.net Mvc 控制器Asp.net Web Api 控制器动态Web Api层Asp.net Core 控制器动态Web Api层AJAX操作相关问题 执行一个AJAX调用在现在的应用里非常常见&…

视达配色教程17 灰色的色彩意象是什么

视达配色教程17 灰色的色彩意象是什么 一、总结 一句话总结:没有个性的色彩 1、灰色的一般意象是什么? 所有混沌的情感不友好的色彩可怕、恐怖和残忍感情贫乏或者内向年龄和年老遗忘的过去贫困与谦虚劣等的颜色秘密与非法合适的中等-男式时装的标准 二、…

AngularJs 相应回车事件

最近做项目,要用到AngularJs,之前也有用过一点点,但仅限于数据的绑定,这次项目要整个前端需要使用这个框架,可能是不熟悉的原因,感觉这代码搞起来非常的不便利,;现总结一个响应回车事…

android6流畅,Android应用流畅(Seamlessness)设计

即使你的应用程序是快速且响应灵敏的,但一些设计仍然会给用户造成问题——与其它应用程序或对话框未事先计划的交互,意外的数据丢失,意料之外的阻塞等 等。避免这些问题,有助于理解应用程序运行的上下文和系统的交互过程&#xff…

stack overflow--技术问答网站

转自:http://baike.baidu.com/link?urleMR6Pwdk9IkauI5B3nZb2Yo3VUAcK6vQfrMpcSMPWqgH0ngqFkup3Gdr3t_s_yZe_UFwkR8c1pboaxhEuY-iwF_nGiUYHajEPMO6Y1kqWvT8aPz7a_T6t3a1vxyTccgKl_UIx1cU-6IP7qjre2ijtq Stack Overflow是一个与程序相关的IT技术问答网站。用户可以在…

8782:乘积最大

【题目描述】 有一个长度为N的数字串,要求选手使用K个乘号将它分成K1个部分,找出一种分法,使得这K1个部分的乘积能够为最大。 【题目链接】 http://noi.openjudge.cn/ch0206/8782/ 【算法】 决策过程:决策插入第i个乘号的位置使插…

uvalive 4973 Ardenia

题意&#xff1a;给出空间两条线段&#xff0c;求距离。 注意输出格式&#xff01; 1 #include<cstdio>2 #include<cmath>3 #include<algorithm>4 using namespace std;5 6 struct Point37 {8 int x, y, z;9 Point3(int x0, int y0, int z0):x(x),y(…

rz和sz上传下载文件

安装软件包 yum install lrzsz 上传文件&#xff0c;输入rz选择文件上传(可以按住shift键多选) # rz sz 下载文件到本地&#xff0c;选择保存文件夹 # sz dd xshell设置默认上传下载文件夹 转载于:https://www.cnblogs.com/fcing/p/9382377.html

上班第一天(6)--一个程序员的成长史(15)

走出公司大门口之后&#xff0c;代是雄看到很多人都朝着一个方向走去。代是雄比较纳闷&#xff0c;于是便问保安这是什么情况。“你是新来的吧&#xff1f;连这个都不知道吗&#xff1f;”保安似乎不屑于回答新人的问题。“我是新来的实习生&#xff0c;”代是雄压制住了心中的…

自学Java汇报(3)

本周自学Java总结&#xff1a; 继承语法、成员变量的隐藏和方法的覆盖、super、final、多态、组合于继承、初始化顺序、部分抽象类。 总用时八小时&#xff0c;编程两小时。 下周目标&#xff1a;接口、枚举、异常。转载于:https://www.cnblogs.com/lianghang/p/9384793.html

怎样在html中设置首字母大写,javascript如何设置字符串首字母大写?

给出一个字符串&#xff0c;如何确保字符串的首字母都大写&#xff1f;下面本篇文章就来给大家介绍一下使用javascript设置首字母大写的方法&#xff0c;希望对大家有所帮助。在javascript中&#xff0c;可以使用slice()方法、toUpperCase()方法和toLowerCase()方法来设置首字母…