1. 应用场景

视频播放要循环播放,另外要在视频第一遍播放结束时出现某种提示。

循环播放:我们可以通过设置setRepeatMode() 进行设置。另外在Player.EventListener的onPlaybackStateChanged(int state) 对播放过程进行监听。

具体过程如下:

 public void onPlaybackStateChanged(int state) {Log.d(TAG, "onPlaybackStateChanged 播放状态:" + state);switch (state) {case Player.STATE_READY:Log.d(TAG, "加载就绪,可以播放");...break;case Player.STATE_BUFFERING:Log.d(TAG, "缓冲中...");...break;case Player.STATE_ENDED:Log.d(TAG, "播放结束...");...break;case Player.STATE_IDLE:...break;}}

一切看起来都是那么的完美…

2. 问题

重点来袭:Player.STATE_ENDED 在开启循环模式下是不会被触发的。

静下来想一下,不难理解,这个状态:表示播放器结束播放媒体。(PS: 循环模式当然是不会结束的啦…)

难道我们只能采取QAQ的方式(关闭循环模式然后在播放结束的时候重新播放…)。如果是这样做的话,费时费力暂且不谈,那还需要我在这里BB,那人生还有什么意趣儿?

3. 解决方案

 public void onPositionDiscontinuity(@Player.DiscontinuityReason int reason) {if(reason == DISCONTINUITY_REASON_PERIOD_TRANSITION){// TODO...//repeatCount++,这里可以累积播放次数,//simpleExoPlayer.currentWindowIndex为当前播放列表索引号}}

请自行翻译:

 /*** Automatic playback transition from one period in the timeline to the next. The period index may* be the same as it was before the discontinuity in case the current period is repeated.*/int DISCONTINUITY_REASON_PERIOD_TRANSITION = 0;

4. 原理

其本质跟QAQ方案是有着异曲同工之妙。

根据timeline(时间轴)的变化,来调用onPositionDiscontinuity()。【PS: 循环播放他也是 0 ----> 终点 ,0 ----> 终点,…进行循环的】

没什么好解释的,请直接看代码注释:

 /*** Listener of changes in player state. All methods have no-op default implementations to allow* selective overrides.*/interface EventListener {/*** Called when the timeline has been refreshed.** <p>Note that if the timeline has changed then a position discontinuity may also have* occurred. For example, the current period index may have changed as a result of periods being* added or removed from the timeline. This will <em>not</em> be reported via a separate call to* {@link #onPositionDiscontinuity(int)}.** @param timeline The latest timeline. Never null, but may be empty.* @param reason The {@link TimelineChangeReason} responsible for this timeline change.*/@SuppressWarnings("deprecation")default void onTimelineChanged(Timeline timeline, @TimelineChangeReason int reason) {Object manifest = null;if (timeline.getWindowCount() == 1) {// Legacy behavior was to report the manifest for single window timelines only.Timeline.Window window = new Timeline.Window();manifest = timeline.getWindow(0, window).manifest;}// Call deprecated version.onTimelineChanged(timeline, manifest, reason);}...
}

附上参考链接:ExoPlayer STATE_ENDED not called after song is finished

ExoPlayer在开启循环播放时 统计播放次数和索引相关推荐

  1. Flowplayer播放器flash全屏播放器带播放按钮

    Flowplayer 是一个开源(GPL 3的)WEB视频播放器.您可以将该播放器嵌入您的网页中,如果您是开发人员,您还可以自由定制和配置播放器相关参数以达到您要的播放效果.本文主要介绍Flowpla ...

  2. java 使用mediainfo_使用mediainfo工具统计每个视频文件(媒体文件)播放时长

    需求 1.运营那边需要统计大量视频文件的播放时长,并汇总记录到excel表中,问我有什么方法搞定 这边搜索了很多统计媒体文件时长的,主要有以下几种 1.使用java获取 2.使用python获取 3. ...

  3. html5视频播放怎么结束,html5设置或返回音频/视频是否应该在结束时再次播放的属性loop...

    实例 将视频设置为循环播放:myVid=document.getElementById("video1");myVid.loop=true; 定义和用法 loop 属性设置或返回音 ...

  4. Android 播放raw文件夹下音频文件,本地MP3文件播放,播放云端MP3文件,获取MP3文件播放时长

    1.复制音频文件到raw文件夹下 2.实例化音频文件 private final MediaPlayer.OnCompletionListener beepListener = new MediaPl ...

  5. 手机影音第十一天,显示视频缓冲,显示卡顿时的网速,播放系统视频时调用播放器的选择...

    代码已经托管到码云,有兴趣的小伙伴可以下载看看 https://git.oschina.net/joy_yuan/MobilePlayer 一.设置视频缓冲进度 显示视频播放进度的效果图如下:灰色的是 ...

  6. Android Video Player. 安卓视频播放器,封装 MediaPlayer、ExoPlayer、IjkPlayer。模仿抖音,悬浮播放,广告播放,列表播放,弹幕

    DKVideoPlayer 项目地址:dueeeke/DKVideoPlayer 简介: Android Video Player. 安卓视频播放器,封装 MediaPlayer.ExoPlayer. ...

  7. 安卓音乐播放时微信视频微信语音电话进来音乐暂停播放

    最近项目中遇到一个问题,app内音乐后台播放时,如果有电话或者微信视频通话进来,app后台音乐还在播放.这样就造成用户体验不好,研究了市面上的音乐播放器,比如网易云音乐就很好的做到了如果有微信视频或者 ...

  8. java 上传mp3文件大小,Java获取音频文件(MP3)的播放时长

    最近的一个项目需要按照时间播放mp3文件,例如,播放10分钟的不同音乐. 这就意味着我得事先知道mp3文件的播放时长,以决定播放几遍这个文件. 方案一:Java的方式 找第三方的库,真的感谢这些提供j ...

  9. EasyCVR播放时cpu占用率较高的原因分析及解决方法

    TSINGSEE青犀视频开发的视频平台都具备Windows和Linux的运行版本,可以根据需求自由选择.当遇到项目现场有流量较大的情况,大多数用户都比较担心对CPU的占用,这种情况可以通过开启按需播放 ...

  10. YouTube iframe嵌入式播放器及播放器参数 自动播放,循环播放,播放列表,不显示 YouTube 徽标

    YouTube 嵌入式播放器及播放器参数 概览 本文档介绍如何在应用中嵌入 YouTube 播放器,并定义了 YouTube 嵌入式播放器可以使用的参数. 通过将参数附加到 iframe 网址末尾,您 ...

最新文章

  1. 2021年春季学期-信号与系统-第八次作业参考答案-第五小题
  2. 特殊权限控制之SUID、SGID、Sticky及facl
  3. SpringBoot @PostConstruct和@PreDestroy使用详解
  4. (转)Maven之自定义archetype生成项目骨架
  5. 语言基础之description方法
  6. 将mysql服务移除_怎么将mysql服务移除?
  7. 安装OpenCL和AMD驱动程序
  8. DB2 一个汉字的Byte数,太操蛋了
  9. NotePad++常用快捷键。——Arvin
  10. 常用音频单位简介:dBSPL、dBm、dBu、dBV、dBFS
  11. java求一元二次方程:ax2+bx+c=0的根
  12. 阿尔卡特交换机配置_ALCATEL-交换机配置手册(中文).doc
  13. python变异系数,Python Scipy stats.variation()用法及代码示例
  14. aws cloudformation 堆栈集的创建和使用
  15. 第60天:攻防世界Mobile两道题
  16. 宏碁笔记本u盘装系统如何进入bios设置u盘启动图文教程
  17. SpringBoot 1.X 优雅停机 ( shutdown gracefully )
  18. HBase 高可用集群整合 Phoenix 配置
  19. 74ls161中rco是什么_【别找了全在这】硬件工程师经典笔试题集锦!
  20. 标准24+1型DVI转VGA头

热门文章

  1. Oracle GoldenGate for MySQL部署踩的坑
  2. 企业生产经营相关英文及缩写之(12)--Currencies 货币代码
  3. hbase snappy 安装_hbase 支持snappy压缩 | 墨荷琼林官网-连载教程
  4. Solidwork软件盗版
  5. 机器人之自动回归原点方法实现
  6. (MDY)2021秋季软件工程 alpha冲刺完善
  7. [计算机视觉] 边缘检测Canny算法原理总结 以及 matlab代码实现
  8. win10关闭快速启动_关闭Win10中这七个不必要的服务,解决电脑卡顿问题。
  9. 11.22 点餐APP第一阶段总结
  10. 电脑端微信文件的存储位置在哪?