此文已由作者吴家联授权网易云社区发布。

欢迎访问网易云社区,了解更多网易技术产品运营经验。

去年年中的时候,借着产品改版的机会,将之前的h5播放器好好整理重构了一番。之前的h5播放器较为简陋,有几个大问题:没有适配移动端(最大的不足)、没有提供直播模式、有一些历史遗留的bug没有修复。重构版除了解决了这几个大问题外,还做了很多的优化。加上与flash播放器的结合和近期飞哥主导的教育产品组件标准化,播放器适用性变得更强更通用了。

1. h5播放器的设计思路


重构后应该包含这些功能:支持点播(非加密的MP4)和直播播放(m3u8)、兼容(适配)移动端、根据平台自动选择(使用flash还是h5)。

框架和库上,还是选择主要使用nej框架,nej提供了很丰富的方法。对外暴露的类使用regular实现,因为教育产品前端组件和业务工程大部分是使用regular的,在使用上会很方便。另外在移动端上选用了flexible方案,因为教育产品的web页适配已经统一使用flexible了,手势事件的处理选用了

为了方便扩展和添加组件,使用了观察者模式。观察者模式在视频播放器这样规模的工程中使用非常合适,也是屡试不爽的一种设计模式。我直接参考了flex中类似的实现,使用js写了一遍(当然自己写也很快)。

图如上所示,component基类和componentContainer单例类实现了观察者模式,所有组件都继承自component类,component实例中可以调用方法发送notification对象进行组件之间的通信,notification的调度则在componentContainer中实现了。这些组件分为必须组件和可选组件,必须组件包括:视频对象组件(movieData)、视频播放组件(mainVideo)、api组件等,可选组件则是根据不同产品的业务需求来开发的,可以通过不同组件列表的配置来自定义播放器的具体功能,这个也是在componentContainer实现。Html5VideoMedia则是对HTMLVideoElement的封装,它不作为一个组件,只是提供视频播放的功能,以及定义了相关的事件,使用Html5VideoMedia的除了视频播放组件,还可以是片头广告组件。

适配方面,样式上的适配使用了flexible的方案。有的组件比较复杂,比如控制条,在web端和移动端功能差别很大,样式差别也很大,可以考虑不同平台使用不同组件(图中可以看到control和controlMobile),逻辑上会很清晰,不用写很多的if和else,不过因为这样要依赖更多的组件,js和css文件会更大一些。个人觉得为了提高代码的可维护性,牺牲部分的文件大小也是可取的。

     

2. hls直播的一些特点

直播状态的判断。其实直播功能跟业务的关联是很大的,这里的直播状态也是只业务中的状态,比如:未开始、即将开始、直播中、直播结束等等。我们产品中目前还是使用前端轮询的方式更新直播的状态,有一点要提的是hls流是不会触发end事件的,所以h5直播的状态其实是完全靠轮询来控制的。

如何判断流异常。一般网络问题或者是源问题的处理可以监听video标签和source标签的error事件,两种标签都需要监听。但是error触发时的错误信息有时候并不信息,或者说不同浏览器实现上不一样,之前有碰到过改变currentTime属性来seek,偶尔会触发error事件,但是error中只说了是网络错误,没有任何其他信息,在对比了其他视频后才确定是某个视频转码的问题,确实十分的蛋疼。在直播流播放过程中,偶尔会出现流异常的情况,流异常一般会表现为画面卡死,不一定触发error事件。我参考了之前青果同事的方案:每隔一段时间检查currentTime,如果在播放状态下currentTime在这段时间内未改变,很可能就是流异常了,则主动重新加载。

3.一些目前无法解决的问题

ios上视频相关的问题很多,因为系统的限制太多了。稍微列一下:

1. 同时只能播放一个视频或者音频,只允许一个video或者audio标签。做片头广告功能会麻烦一点。

2. ios版本较低的Safari中播放视频会强制全屏,ios 10中可以使用playsinline。在微信和一些定制的webkit中可以添加webkit-playsinline解决。

3. 在没有人为操作的情况下,无法实现进入页面自动开始播放视频

4. ios中无法使用js控制video音量,只能由物理按键控制。在ios中你可以直接隐藏音量控制功能了。。。

5. 还有截屏的问题,不过产品中没有使用到就暂时没有调研。

android上的问题也很多,主要是因为android版本太多、机型太多,各方面参差不齐。稍微列一下:

1.    部分android系统会直接替换video标签,使用系统播放器播放,常见于国产手机

2.    canPlayType方法检测结果与实际不符,这个问题在开发过程中遇到过,例如在一部华硕手机上检测到不支持m3u8播放,但是实际却可以播放,原本想放开这个限制的,后来发现在云课堂app的webview中强制播放可能会导致app崩溃,所以最后还是加上了检测。。

3.    不支持m3u8播放的android一般是android4.0左右及以下的

网易云免费体验馆,0成本体验20+款云产品!

更多网易技术、产品、运营经验分享请点击。

相关文章:
【推荐】 SVN迁移到GIT
【推荐】 Android中Textview显示Html,图文混排,支持图片点击放大
【推荐】 验证码何时可以退出历史舞台?

wap html5播放器和直播开发小结相关推荐

  1. 搭建rtmp直播流服务之4:videojs和ckPlayer开源播放器二次开发(播放rtmp、hls直播流及普通视频)...

    前面几章讲解了使用 nginx-rtmp搭建直播流媒体服务器; ffmpeg推流到nginx-rtmp服务器; java通过命令行调用ffmpeg实现推流服务; 从数据源获取,到使用ffmpeg推流, ...

  2. html在线音频播放器实训总结,HTML5 播放器心得与小结

    随着 HTML5 的普及,越来越多视频网站使用 标签播放直播.点播内容(如下图所示).使用 的好处,主要以下两点. 可以直接在页面中播放,也就是所谓的"区域播放",上半屏是视频播放 ...

  3. html5 p2p直播源,屏蔽html5播放器p2p上传

    // ==UserScript== // @name 屏蔽html5播放器p2p上传 // @version 0.1.3 // @description 屏蔽html5播放器使用WebRTC技术进行p ...

  4. 斗鱼直播切换html5播放器,GitHub - gooyie/DouyuHTML5Player: 替换斗鱼的Flash弹幕播放器...

    斗鱼HTML5播放器 基于 flv.js 的斗鱼HTML5播放器. 使用了 flv.js 内核提供的直播流播放, 用 JavaScript 实现了斗鱼的弹幕协议, 并支持发送弹幕和送礼物. 使用 不要 ...

  5. 熊猫怎么用html5看直播,熊猫TV HTML5播放器自动网页全屏

    // ==UserScript== // @name 熊猫TV HTML5播放器自动网页全屏 // @name:zh-CN 熊猫TV HTML5播放器自动网页全屏 // @namespace pand ...

  6. 网页html5播放器,一个强大的开源HTML5视频播放器,字节出品

    哈喽,大家好!现在短视频.直播十分的火,相信许多开发童鞋都遇到要在项目中加入视频组件的情况吧. 一般视频播放或者直播的前端组件都要有诸如弹幕.清晰度调整.倍数播放等功能,今天精选板给大家带来的就是这样 ...

  7. 7款高颜值HTML5播放器:让你的音乐有声有色

    原文:http://www.codeceo.com/article/7-cool-html5-player.html 这篇文章我们要分享一些很有个性的HTML5音乐播放器和视频播放器,它们都具有播放器 ...

  8. html5播放器视频倍速播放功能

    阿酷TONY 2021-3-24 1. 倍速播放功能可以让视频加速或者减速播放: 2. 在PC端,HTML5播放器能轻松实现倍速播放功能,您可以将视频的播放速度设定为0.5倍,1倍(正常速),1.2倍 ...

  9. HTML5播放器示例写法

    HTML5播放器参数: 属性 值 描述 autoplay autoplay 如果出现该属性,则视频在就绪后马上播放. controls controls 如果出现该属性,则向用户显示控件,比如播放按钮 ...

最新文章

  1. python计算输入的两个数字,try...except...判断是否输入的是数字,如果是则相加
  2. H3CNE考试讨论群
  3. 编写代码,实现一个栈(Stack)的类。
  4. 《STL源代码剖析》---stl_set.h阅读笔记
  5. Java web (JSP)入门
  6. c #include如何找到文件_使用 MATLAB Function 模块集成 C 代码
  7. AT2164 AGC006C Rabbit Exercise
  8. docker在win7下的使用
  9. 20145203盖泽双《网络对抗技术》后门原理与实践
  10. SQL调优技巧:统计信息(文末福利)
  11. pdf转HTML出现乱码,PDF转Word出现乱码解决方法
  12. Word去除段前黑点
  13. (一)SLAM拓扑地图(地图的生成和显示)
  14. Mapbox矢量切片本地化(离线)生成与发布方案
  15. Multithreaded Rendering Graphics Jobs 多线程渲染与图形Jobs 性能系列8
  16. Java 之 Serializable 序列化和反序列化的概念,作用的通俗易懂的解释
  17. poj 3975hdu 1850 (nim)
  18. 7-25朋友圈(C语言版)
  19. Java Exception最佳实践
  20. DDR2 DDR3 DDR4 默认参数(时序、电压、频率)整理和超频经验分享

热门文章

  1. 一加和华为买哪个好?一加9pro用实力告诉你
  2. OneDrive无法正常登录
  3. Pintech品致N系列差分探头的特点和应用领域
  4. 手术后的剖腹产疤痕增生可以消除吗
  5. 自定义View实现支付宝芝麻信用页面功能
  6. mysql 时间排序查询_Mysql排序查询
  7. Flutter 与 React Native 该如何选择
  8. c语言实现简单的加减乘除运算---@颜麓
  9. Jinja2 简明使用手册
  10. k8s临时容器ephemeral