highso-fe / highso-fe-blog

:books: 嗨学网前端团队技术博客
15 stars 3 forks source link

<video> 技术调研 #8

Open ghost opened 7 years ago

ghost commented 7 years ago

2017-04-02 发布,最后更新于 2017-04-02

HTML <video> 元素 用于在 HTML 或者 XHTML 文档中嵌入视频内容。具体参考 MDN - video

重要属性

重要事件

详细信息参考 MDN - 媒体相关事件

兼容性

视频预加载

这里有两个概念:

对于 preload,IOS Safari 不支持,部分 Android 浏览器支持;在视频开始播放前,大部分浏览器会将当前待播放的视频缓冲一部分,确保后续可以流畅播放,而不是将整个视频进行缓冲。

对于 prefetch,IOS Safari 不支持,具体浏览器支持情况参考 Can I use - prefetch,也可以用浏览器访问 Prefetch Information 来检测是否支持 prefetch。即使浏览器支持 prefetch 资源,但由于视频格式资源在 prefetch 后无法被缓存,因此目前无法实现播放第一段视频的时候预下载第二段视频。

PS: 关于 prefetch,我在支持 prefetch 的 chrome 浏览器下作了测试,播放第一段视频的时候确实会请求第二段视频的整个资源,但在接下来播放第二段视频的时候之前预加载的资源没有被缓存。测试 Demo 代码可在 这里 下载,测试时请将网速调整至 Regular 2G 以模拟低网速情况

封面图片

可以使用 poster 属性来设置视频封面图片(海报帧),IOS Safari 支持,但加载速度明显比在 <img> 中显示要慢,而 Android 浏览器部分支持。因此推荐使用 <img> 的方式设置视频的封面图片

自动播放

IOS Safari 中不支持,但在 webview 中可能被开启;iOS 开发文档明确说明蜂窝网络下不允许 autoplay;Android 浏览器部分支持

最佳实践

设置 width 和 height

使用 <video> 标签时推荐明确设置 widthheight 属性且不能为0,否则在 IOS Safari 下可能会导致布局 Bug

设置封面图片

直接将 <video> 显示在页面中,视频播放的初始效果会因内置浏览器而存在差异。建议先将视频设置为 1px x 1px 大小并放置于边缘处,并使用图片和样式模拟视频封面图,但需要提供视频封面图片。

另一种方案是先隐藏视频播放控件(controls),在上面布一层半透明带播放按钮的图片,当点击该图片时触发视频的播放事件