为了监控移动端视频播放的情况,研究了一下 html5 <video> 标签的属性与事件触发,及其在各系统和各个浏览器的兼容情况

属性与事件

理解清楚属性和事件,才能更好的使用 video ,达到预期的效果,更好的检测视频播放的状况来做出分析和调整,这里仅列举了解到且大致理解的,更多相关后续补充

属性

<video> 标签嵌入到HTML文档中

  1. <video src="" type="video/mp4" autoplay="autoplay" controls="" poster="" preload="none"></video>

初始化 <video> 标签时主要设置的属性

  1. src:要嵌到页面的视频的URL。可选;你也可以使用video块内的 <source> 元素来指定需要嵌到页面的视频

  2. autoplay:布尔属性;指定后,视频会马上自动开始播放,不会停下来等着数据载入结束

  3. controls:加上这个属性,Gecko 会提供用户控制,允许用户控制视频的播放,包括音量,跨帧,暂停/恢复播放

  4. poster:一个海报帧的URL,用于在用户播放或者跳帧之前展示。如果属性未指定,那么在第一帧可用之前什么都不会展示;之后第一帧就像海报帧一样展示

  5. preload:该枚举属性旨在告诉浏览器作者认为达到最佳的用户体验的方式是什么。可能是下列值之一:

    • none:提示作者认为用户不需要查看该视频,服务器也想要最小化访问流量;换句话说就是提示浏览器该视频不需要缓存

    • metadata:提示尽管作者认为用户不需要查看该视频,不过抓取元数据(比如:长度)还是很合理的

    • auto:用户需要这个视频优先加载;换句话说就是提示:如果需要的话,可以下载整个视频,即使用户并不一定会用它

    • 空字符串:也就代指 auto 值

  6. buffered:这个属性可以读取到哪段时间范围内的媒体被缓存了。该属性包含了一个 TimeRanges 对象

  7. played:一个 TimeRanges 对象,指明了视频已经播放的所有范围

  8. loop:布尔属性;指定后,会在视频结尾的地方,自动返回视频开始的地方

  9. muted:布尔属性,指明了视频里的音频的默认设置。设置后,音频会初始化为静音。默认值是 false ,意味着视频播放的时候音频也会播放

  10. height:视频展示区域的高度,单位是 CSS 像素

  11. width:视频显示区域的宽度,单位是 CSS 像素

  12. crossorigin:该枚举属性指明抓取相关图片是否必须用到CORS(跨域资源共享)。 支持CORS的资源 可在 <canvas> 元素中被重用,而不会被污染。允许的值如下:

    • anonymous:跨域请求会被执行,但是不发送凭证。

    • use-credentials:跨域请求A cross-origin request会被执行,且凭证会被发送。

TimeRanges 对象表示事件段,比如,视频快进的时间段,有一个 length 属性,表示时间段的个数,有两个方法 start() 和 end() ,分别返回时间段开始的时间点和结束的时间点

事件交互中主要使用的属性

  1. currentTime:播放进行到的时间点,单位为秒

  2. duration:视频总时长,单位为秒

事件

还有更多事件api,这里只列举了试过的

  1. playing:在媒体开始播放时触发(不论是初次播放、在暂停后恢复、或是在结束后重新开始)

  2. ended:播放结束时触发

  3. pause:播放暂停时触发

  4. waiting:在一个待执行的操作(如回放)因等待另一个操作(如跳跃或下载)被延迟时触发

  5. timeupdate:元素的 currentTime 属性表示的时间已经改变

  6. seeking: 在跳跃操作开始时触发

  7. seeked:在跳跃操作完成时触发

  8. error:在发生错误时触发。元素的 error 属性会包含更多信息

  9. loadeddata: 媒体的第一帧已经加载完毕

监控指标

  1. 播放:start:1(首次播放)2(重播)

  2. 播放:end:1

  3. 播放暂停:pause:1

  4. 播放中止:pause:1

  5. 快进/快退:jump:1(快进)2(快退)

  6. 错误:fail: 1(取回过程);2( 当下载时发生错误);3( 当解码时发生错误);4( 不支持音频/视频)

  7. 播放等待: wait:1

  8. 播放时长:totaltime:秒(包含重播)

其中1,2,3,5,6,7都很好监控,对相应事件进行监听就可以了,这里主要讲下是怎么监控播放中止和播放时长的

播放中止

具体场景是移动端浏览器切换tab导致的隐藏和用户按home键退出浏览器

html5 提供了 Page Visibility API 来支持监听tab切换,与之对应新增了

  • document.hidden 属性,它显示页面是否为用户当前观看的页面,值为 ture 或 false

  • document.visibilityState 属性, visible 表示页面被展现, hidden 表示页面未被展现, prerender 表示页面在重新生成,用户不可见

  • visibilitychange 事件,监听页面在 visible 与 hidden 之间的切换

visibilitychange事件的具体使用

  1. var hidden;
  2. var visibilityChange;
  3. if (typeof document.hidden !== 'undefined') {
  4. hidden = 'hidden';
  5. visibilityChange = 'visibilitychange';
  6. } else if (typeof document.mozHidden !== 'undefined') {
  7. hidden = 'mozHidden';
  8. visibilityChange = 'mozvisibilitychange';
  9. } else if (typeof document.msHidden !== 'undefined') {
  10. hidden = 'msHidden';
  11. visibilityChange = 'msvisibilitychange';
  12. } else if (typeof document.webkitHidden !== 'undefined') {
  13. hidden = 'webkitHidden';
  14. visibilityChange = 'webkitvisibilitychange';
  15. }
  16. document.addEventListener(visibilityChange, function () {
  17. if (document[hidden]) {
  18. // do something...
  19. }
  20. }, false);

关于 visibilitychange 事件的兼容性,测试了两部手机,华为mt7 和 iphone6 ,兼容情况如下

华为mt7

  • qq浏览器:tab切换触发,home键退出触发

  • uc浏览器:tab切换触发,home键退出触发(退出后进程继续在跑,其它浏览器进程被暂停)

  • 手机百度:tab切换不触发,home键退出不触发

iphone6

  • uc浏览器:tab切换触发,home键不触发

  • 百度浏览器:同上

  • 手机百度:同上

  • Safari:tab切换触发,home键退出触发

由于兼容问题,且各系统的各个浏览器基本在tab切换触发,home键退出触发的情况下触发pause事件,所以播放中止的日志依旧打印pause,如果后面没有继续操作则把这个pause日志当做播放中止

页面刷新和浏览器tab被关闭的时候会触发 window.onunload ,也可以做为补充场景

播放时长

起初的思路是获取到开始播放到停止播放的事件差,记下时间点使用了 currentTime 属性,主要实现在两方面

  1. playing 时记下时间点startT, pause 和 ended 和 seeked 时记下时间点endT,endT - startT 即播放时长

  2. seeked 时记下时间点startT, seeking 时记下时间点endT,endT - startT 即播放时长

这个思路在 ios 下是看似没有问题的,但是 android 下确实不行,主要原因是 seeking 事件的监听没理解到位,seeking 事件触发点是用户目标跳跃到的位置,比如:视频播放在 0 秒点时,用户点击到了 60 秒点处,这是取到的 currentTime 就是 60 ,本来以为会是 0 , ios 下看似没有问题是因为它的全屏播放模式下,进度条是要拖拽的,不能直接点击到某个点

于是,使用 timeupdate 来获取 seeking 触发前的时间点,就可以获取到相对准确的播放时长了

遇到的一些状况

  • ios 下的qq浏览器和uc浏览器里播放 html5 video 会启用浏览器自己的播放窗口,qq浏览器什么事件都监听不到,uc浏览器监听不到 seeking 和 seeked

  • 没有 <source> 元素且 src 元素为空时播放会触发 error 事件,状态码为4

  • 播放播放结束也会触发暂停

  • 播放结束后重播会触发 seeking 和 seeked ,一般浏览器触发一次, android 下uc浏览器触发4次

  • ios 下uc浏览器和 android 下的一些浏览器不会触发 seeking 和 seeked ,因此需要在 timeupdate 里来分析猜测用户行为

总结

欲先善其事必先利其器,遇到没搞过的技术,一定要先测试一遍 api ,不然太浪费时间,学习内容来源

媒体相关事件

希望能多提宝贵建议,帮助笔者继续优化

文章转载自笔者个人博客 Gaoxuefeng's Blog

html5的video元素学习手札的更多相关文章

  1. HTML5之video元素

    一.video元素支持的视频格式 HTML5中的video标签支持3种常用的视频格式: 1.Ogg = 带有Theora 视频编码和Vorbis 音频编码的 Ogg 文件: 2.MPEG4 = 带有H ...

  2. 【HTML5】HTML5中video元素事件详解(实时监测当前播放时间)

    html 代码..video后边几个元素,可处理ios 系统的兼容性 <video id="myVideo" controls="controls" po ...

  3. html5,video元素

    <video src="1.mp4" controls="" width="500"  height="300" ...

  4. html5的source元素

    html5的source元素 一.总结 一句话总结: 主要是解决视频播放时候的浏览器的兼容问题 二.html5的source元素 学习要点 掌握source元素的用法 source元素-解决浏览器额兼 ...

  5. html5标签video(播放器)学习笔记(二)-基本操作

    html5标签video(播放器)学习笔记(二)-基本操作 subying 发布时间: 2014/12/01 23:59 阅读: 13008 收藏: 21 点赞: 3 评论: 0 摘要 本文介绍了ht ...

  6. 解决html5中video标签无法播放mp4问题的办法

    这篇文章主要给大家介绍了关于解决html5中video标签无法播放mp4问题的办法,文中介绍的非常详细,相信会对大家的学习或者工作具有一定的参考学习价值,需要的朋友们下面来一起看看吧. 最近发现了一个 ...

  7. html5--4-2 video元素的属性

    html5--4-2 video元素的属性 学习要点 掌握video元素的基本用法 直到现在,在网页中的大多数视频是通过插件(比如 Flash)来显示的.然而,并非所有浏览器都拥有同样的插件.HTML ...

  8. html5的 embed元素 和 object元素

    html5的 embed元素 和 object元素 一.总结 一句话总结: embed定义嵌入的内容,比如插件,比如flash object定义定义一个嵌入的对象,用于包含对象,比如图像.音频.视频. ...

  9. HTML5 Audio/Video 标签,属性,方法,事件汇总

    HTML5 Audio/Video 标签,属性,方法,事件汇总 (转) 2011-06-28 13:16:48   <audio> 标签属性:src:音乐的URLpreload:预加载au ...

随机推荐

  1. Qt:自动为class的所有属性生成getter、setter

    在类所在的.h文件中,右键类名,Refactor → Create Getter and Setter

  2. Applied-Social-Network-Analysis-in-Python 相关笔记4

    模型数据越多,Average系数就越小. perferential attachment model 有比较小的平均路径长度,但有着小的cc. rewire:重新连接 如果仅看这个共同的邻居数的话,数 ...

  3. LGP6694题解

    第一眼似乎很困难,实际上非常简单( 好吧这题我做了一个小时( 首先期望具有线性性,我们转化为计算点对对答案的贡献. 发现相对位置一样的点对对答案的贡献是一样的.我们把相对位置一样的点对铃出来,乘了之后 ...

  4. CF1386C口胡

    自己在物理课上编了一道题,大概就是这题把删除区间的边改为保留区间的边...都不觉得判断短路和判断二分图有点儿像吗 题意:给定一张无向图,每次暂时删除一个区间内的边,问删除后这个区间是否为二分图. 首先 ...

  5. Keras速查_CPU和GPU的mnist预测训练_模型导出_模型导入再预测_导出onnx并预测

    需要做点什么 方便广大烟酒生研究生.人工智障炼丹师算法工程师快速使用keras,所以特写此文章,默认使用者已有基本的深度学习概念.数据集概念. 系统环境 python 3.7.4 tensorflow ...

  6. 2022 年最受瞩目的新特性 CSS @layer 到底是个啥?

    步入 2022,CSS 的新特性层出不穷,而最近在 CSS 圈最受瞩目的新特性,非 CSS @layer 莫属. 本文,将用最简洁的语言,快速让读者们搞懂,到底什么是 CSS @layer 新规范. ...

  7. 昇腾CANN论文上榜CVPR,全景图像生成算法交互性再增强!

    摘要:近日,CVPR 2022放榜,基于CANN的AI论文<Interactive Image Synthesis with Panoptic Layout Generation>强势上榜 ...

  8. IDEA版部署离线ArcGIS api for JavaScript

    痛苦!折磨! 这两天发现IDEA 做ArcGIS api 开发比EClipse好用(重点是没有JS提示).但引入的ArcGIS api 一直报错,说找不到.这两天思来想去就是不知道为什么找不到loca ...

  9. Linux中8个有用的touch命令

    在Linux中,每个文件都有时间戳,并且每个文件都存储上次访问时间,上次修改时间,上次改变时间的信息.因此,无论什么时候我们创建新的文件,访问或者修改一个存在的文件,那个文件的时间戳会自动被更改. 在 ...

  10. SolidWorks在一个零件中设置不同的尺寸版本

    问题 比如想设置一系列螺丝的长度,一个一个建零件非常麻烦,希望在一个零件中设置不同的长度尺寸版本 解决 比如想设置不同的拉伸长度,右键拉伸>配置特征 可以生成新配置,设置不同的D1参数,即可生成 ...