偶然在多个页面使用了阿里云提供的播放器的系统里发现个 BUG

在 PC/MAC 端的 Chrome 浏览器中
1. 一部分页面加载播放器时报错且没有任何提示
2. 而另一部分页面加载播放器时,Chrome 会弹出“是否允许该页面使用 Flash Player”的提示,点击”允许“,则视频正常播放
3. 在可正常播放视频的页面中,点击了“允许”后,再回到有问题的页面,刷新,发现此时这类页面的播放器也可以正常工作了

BUG 分析

简单对两类页面进行人肉 diff 操作发现
1. 表现不正常的页面引用的 js 路径为 http://g.alicdn.com/de/prismplayer/1.5.2/prism-min.js
2. 而可以正常工作的页面引用 js 路径为 http://g.alicdn.com/de/prismplayer/1.4.7/prism-min.js

因官方宣称这个播放器会自适应 H5 和 Flash 两种模式,从出错的表象来看,猜测是 1.5.2 版本的自适应逻辑有一些问题。一开始想简单解决,猜测最新版本的播放器应该已经解决了这个 BUG,于是直接换用最新版本(1.5.7),测试后发现问题依旧,只是最新版本在播放器中多了一行文字提示,大意是播放类型不支持

为了定位问题,下载了两个链接对应的源 prism.js(去除后缀 -min,一般带 -min 的 js 都是经过压缩、混淆,用于正式环境加载使用)文件

分析对比两个版本,发现与此问题相关的核心代码如下

v1.4.7

return tag['player'] ||(UA.IS_MOBILE ? new Player(tag, option) : new FlashPlayer(tag, option));

v1.5.7

return tag['player'] ||(UA.IS_H5 ? new Player(tag, option) : new FlashPlayer(tag, option));

可以从代码中看出该播放器自适应的逻辑,在 v1.4.7 中依据 UA.IS_MOBILE 来判断是否是移动端,是则创建 H5 播放器对象,否则 创建 Flash 播放器对象;而在 v1.5.7 中,依据UA.IS_H5 来判断,如果该变量为逻辑真,则使用 H5 播放器,否则为 Flash 播放器

所以在 PC/MAC 平台,且使用了 v1.4.7 版本的页面上,IS_MOBILE 值一定为逻辑假,所以无论如何,都会直接创建 Flash 播放器对象,从而触发向 Chrome 申请 Flash Player 使用权限的逻辑,看上去没有什么问题

而在使用了 v1.5.7 版本的页面上,IS_H5 值为逻辑真,于是创建 H5 播放器对象。那么问题来了,为什么这种情况下会出错。在重新仔细阅读了一遍官方文档后,看到文档中有这样一段内容

Flash 模式:
* 视频格式: mp4、flv、m3u8、rtmp、mp3
* 视频编码: H.264
* 音频编码: AAC、MP3

HTML5 模式:
* 视频格式: mp4、m3u8
* 视频编码: H.264
* 音频编码: AAC
m3u8格式播放依赖调用端浏览器支持情况:iOS全系列支持,Android 4.0及以上版本支持。

根据播放类型不支持的错误提示,对照这段内容,想到业务所需播放的视频类型为 m3u8 格式,正好对上了上述内容最后一句话

m3u8格式播放依赖调用端浏览器支持情况:iOS全系列支持,Android 4.0及以上版本支持。

看来问题是出在 PC/MAC 端的 Chrome 目前并不支持 HTML5 播放器播放 m3u8 格式的视频流

到这里,问题已经原因基本已经明确了,但是还有个小问题,即前文提到的

在可正常播放视频的页面中,点击了“允许”后,再回到有问题的页面,刷新,发现此时这类页面的播放器也可以正常工作了

为什么会有这种情况,难道在使用 v1.4.7 播放器的页面点击了“允许该域名使用 Flash Player”后,使用 v1.5.* 播放器的页面中 UA.IS_H5 的值发生了变化,从而变成了 Flash 模式?
为了验证这个疑问,修改 v1.5.7 版本 prism.js 的内容,加一行 console.log(UA.IS_H5)
接下来进行验证
1. 清空 Chrome 中的 Flash Player 使用权限白名单,保证该域名如需使用 Flash Player,需先向用户请求权限
2. 在使用 v1.5.7 版本播放器的页面中,在控制台看到 UA.IS_H5 值为 True
3. 在使用 v1.4.7 版本播放器的页面中,点击播放器视频,在浏览器弹出提示框点击“允许”。此时该域名将被添加到 Chrome 白名单,永久拥有了使用 Flash Player 的权限
4. 重新回到使用 v1.5.7 版本播放器的页面,刷新并发现此时 UA.IS_H5 值为 False

可以看出页面是否拥有 Flash Player 使用权限,确实影响到了 UA.IS_H5 的值,从而影响了页面自适应播放器模式
UA 对象是 prism.js 通过 require() 方式从其他 js 中得到,而阿里云限制了对该 js 的访问,所以 UA.IS_H5 究竟是如何获得值,也就不得而知了
到此,导致该问题的全部原因都清楚了

解决方案

  1. 将自适应版本替换为 Flash 版,强制使用 Flash。缺点是这样一来就相当于放弃了未来移动端扩展
  2. 将全部 v1.5.* 版本 js 替换为 v1.4.7。因业务需求较简单,所以规避该问题即可,1.4.7 已能满足用户需求

思考

从文档来看,阿里云的开发人员很清楚这个问题,但给出的兼容方案并不好,可以考虑优化,比如以下方案
- 最简单版本:播放器提示语除了表明“播放类型不支持”,最好再明确一下为什么不支持,即便在原提示语上加个可以点击跳转到官方文档的链接都好
- 自适应逻辑中,多加一层判断,当前浏览器内核是否支持 HTML5 模式下 m3u8 格式视频流的播放。如果不能且非移动端浏览器,转而执行 Flash 模式流程,而不是强行走 HTML5 流程,给用户一个莫名其妙的错误

踩了阿里云播放器的一个坑相关推荐

  1. 阿里云播放器SDK的正确打开方式 | Aliplayer Web播放器介绍及功能实现(三)

    阿里云播放器SDK(ApsaraVideo for Player SDK)是阿里视频云端到云到端服务的重要一环,除了支持点播和直播的基础播放功能外,还深度融合视频云业务,支持视频的加密播放.安全下载. ...

  2. Swift 第三方 播放器AliyunPlayer,音乐(阿里云播放器)(源码)

    一直觉得自己写的不是技术,而是情怀,一个个的教程是自己这一路走来的痕迹.靠专业技能的成功是最具可复制性的,希望我的这条路能让你们少走弯路,希望我能帮你们抹去知识的蒙尘,希望我能帮你们理清知识的脉络,希 ...

  3. h5阿里云播放器 常规使用

    阿里云播放器: 引入js和css <script type="text/javascript" charset="utf-8" src="htt ...

  4. 阿里云播放器AliyunPlayer的走马灯组件的位置

    引入当前组件, 播放器配置中添加如下代码: components: [{name: 'BulletScreenComponent',type: AliPlayerComponent.BulletScr ...

  5. 在vue项目中使用阿里云播放器

    在官方文档中分为HTML5和Flash两种播放模式我用的是html5的播放模式,下面是阿里云官方文档 阿里云播放器的使用说明_视频点播-阿里云帮助中心 首先在index.html文件中引入 <l ...

  6. 解决ijkplayer和阿里云播放器冲突的解决

    ijkplayer和阿里云播放器的冲突问题解决 今天遇到导入阿里云的播放器跟自身的ijkplayer播放器产生冲突的问题 ijkplayer 报错 IJKSDLGLView: setupDisplay ...

  7. nuxt项目打包后阿里云播放器错误:ReferenceError Aliplayer is not defined

    nuxt项目打包后阿里云播放器错误:ReferenceError: Aliplayer is not defined 这个问题搞了我一天,阿里云视频播放有时点进去是好的,有时候就报错,而且一刷新也报这 ...

  8. 关于,VUE中,阿里云播放器报错:Aliplayer is not defined。

    VUE中,阿里云播放器报错:Aliplayer is not defined.-Java-CSDN问答 感谢@iMingzhen大哥的解答!

  9. 腾讯迁移至阿里云播放器

    目前APP中视频模块使用了腾讯及阿里两套播放器,造成维护困难.包体增大.恰逢开谈项目下线决定进行播放器业务迁移. 首先需要熟悉一下各个播放器的使用方法以及业务中的应用场景.涉及的模块包括直播拉流.直播 ...

  10. 苹果CMS V10 整合阿里云播放器-带记忆播放

    这篇整合教程加了阿里播放器的记忆功能,去除了弹幕,资源预加载等功能. 有人会说,我用ck .dp不好吗?为啥要用aliplayer,阿里播放器的记忆功能很给力,比如手机播放页面在后台放了很久,隔了几天 ...

最新文章

  1. 记录猫眼电影的自定义字体反爬
  2. leetcode- nim game
  3. iOS 混合网页开发 问题
  4. spring 启动加载数据_12个很棒的Spring数据教程来启动您的数据项目
  5. UProceduralMeshComponent
  6. 图像的频率谱和功率谱代表什么_使用 FastAI 和即时频率变换进行音频分类
  7. 学考计算机删除键是什么字母,考计算机的童鞋注意啦~计算机基础题答案~
  8. HBase简介及使用
  9. 计算机windows试题,计算机基础《Windows》考试试题
  10. C6678之外部存储器接口EMIF
  11. 【历史上的今天】1 月 14 日:IBM 计算机先驱诞生;Windows 7 寿终正寝;诺基亚收购阿尔卡特
  12. Azure Active Directory B2C (1)
  13. 试验设计(DOE)方法及其关键工具
  14. ros中odometry数据生成方式与分发去向
  15. 信息与计算机科学学校排名,2021中国信息与计算科学专业大学排名 最好的高校排行榜...
  16. Android基础整合项目之节日群发助手(一)
  17. 象棋的杀法??????
  18. 大数据圈儿微信公众号
  19. 华为、微软、戴尔等企业将参加“多哈智慧城市博览会”
  20. JAVA整合Milvus矢量数据库及数据

热门文章

  1. Visio Professional详细教程(一)
  2. 关于微信投票微信投票神器及微信刷票软件免费版如何操作微信投票怎么免费刷票
  3. 三步完成自动抢票,又一款春节免费抢票神器推荐
  4. python 快速排名发包_百度发包快排【SEO超快速排名系统】 - 「黑酷SEO」
  5. qgc地面站如何导入离线地图_【技术贴第三期】如何玩转离线地图?
  6. 新版php卡盟排行榜网站源码
  7. c语言正方体的表面积和体积公式,长方体的表面积(正方体体积的计算公式)
  8. 3dsmax给物体贴图之后,物体不显示贴图的解决办法
  9. python积最大的分解_pyfactor
  10. 计算机病毒与恶意软件