Wang's blog Wang's blog
首页
  • 前端文章

    • HTML教程
    • CSS
    • JavaScript
  • 前端框架

    • Vue
    • React
    • VuePress
    • Electron
  • 后端技术

    • Npm
    • Node
    • TypeScript
  • 编程规范

    • 规范
  • 我的笔记
  • Git
  • GitHub
  • VSCode
  • Mac工具
  • 数据库
  • Google
  • 服务器
  • Python爬虫
  • 前端教程
更多
收藏
关于
  • 分类
  • 标签
  • 归档
GitHub (opens new window)

Wang Mings

跟随大神,成为大神!
首页
  • 前端文章

    • HTML教程
    • CSS
    • JavaScript
  • 前端框架

    • Vue
    • React
    • VuePress
    • Electron
  • 后端技术

    • Npm
    • Node
    • TypeScript
  • 编程规范

    • 规范
  • 我的笔记
  • Git
  • GitHub
  • VSCode
  • Mac工具
  • 数据库
  • Google
  • 服务器
  • Python爬虫
  • 前端教程
更多
收藏
关于
  • 分类
  • 标签
  • 归档
GitHub (opens new window)
  • Python爬虫

  • 前端教程

    • 团队规范

    • Project

      • Axios用法与原理
      • css布局技巧
      • 深度学习平台术语
      • 谈谈前端天花板问题
      • 一个程序员的成长之路
      • Markdown-It 解析原理
      • minipack源码解析
      • PostCSS
      • Electron工程踩坑记录
      • H5 Video踩坑记录
        • [#](#_1-基本video属性设置) 1.基本video属性设置
        • [#](#_2-自动播放) 2.自动播放
        • [#](#_3-视频开始短暂黑屏) 3.视频开始短暂黑屏
        • [#](#_4-部分android机跳到x5-player播放视频) 4.部分Android机跳到x5 player播放视频
        • [#](#_5-视频canplay的坑) 5.视频canplay的坑
        • [#](#_6-safari可以缩放视频) 6.safari可以缩放视频
      • Puppeteer翻页爬虫
      • 重构你的javascript代码
      • RxJS入门实践
      • 官网脚手架思考与实践
      • Stylelint样式规范工具
      • TypeScript开发Vue应用
      • Typescript tsconfig.json全解析
      • Vue项目TypeScript指南
      • TypeScript在Vue2.x中的坑
      • Vue Dialog弹窗解决方案
      • Vue JSX插件依赖及语法实践
      • Webpack 模块打包原理
      • Webpack4 配置详解
      • Webpack4 devServer配置详解
      • Webpack3.x升级Webpack4指南
    • JS

    • NodeJS

    • Vue

    • React

    • 效率工具

    • 读书笔记

  • 教程
  • 前端教程
  • Project
wangmings
2022-07-19
目录

H5 Video踩坑记录

# # H5 Video踩坑记录

临时接手一个即将上线的公司项目,纯H5活动页,内容不多,但对还原度和各机型兼容性(尤其是Android机型)有极高要求。涉及的问题很多,这里重点说下在H5中Video的一系列坑。插个技术选型问题,不复杂的活动页建议使用jquery技术栈,而不是使用vue和reactjs等。后者的优点在于组件系统,可复用度高,适合大型项目。活动页一般UI改动频繁,动效多,适合jquery插件生态,添加也方便。笔者半道接替该vue项目,中间要加一些新特性,还得看看有没有对应的vue轮子,十分麻烦。

效果请戳:H5 Video (opens new window) (opens new window)(在移动端模式查看)

# # 1.基本video属性设置

  1. poster:视频未播放前的代替图片,如果未设置该属性,默认使用视频第一帧(但小部分机型兼容性不好)。建议添加

  2. muted: 静音. 建议添加

  3. webkit-playsinline/playsinline: 视频播放时局域播放,不脱离文档流 。基本保证iphone手机在H5页面内播放。个别不支持可以引入第三方库iphone-inline-video。建议添加

  4. x5-video-player-type="h5"/x5-playsinline: 启用同层H5播放器,保证anroid手机在H5页面内播放,但在各android机型下表现不一。建议添加

    <video
        ref="video"
        :poster="startSource"
        muted
        x-webkit-airplay="allow"
        x5-video-player-type="h5" x5-playsinline
        webkit-playsinline playsinline>
        <source :src="videoSource" type="video/mp4" />
    </video>
    
1
2
3
4
5
6
7
8
9
10

# # 2.自动播放

先说结论:如果需要微信/网易云音乐/微博/QQ/浏览器等各平台完美自动播放,不行。正确的解决方案:让视觉设计引导用户点击屏幕,进行播放视频。或者如果产品能接受,只要用户接触屏幕就开始播放(监听touchstart事件)。错误方式:video标签autoplay 、js执行video.play、load完成后执行play()

只在微信端传播。微信浏览器是经过特殊处理的,可以通过回调WeixinJSBridgeReady解决,适用于iPhone和anroid。注意自动播放的视频要无音轨或者手动muted。见示例代码:

    <!-- 必须加在微信api资源 --> 
    <script src="http://res.wx.qq.com/open/js/jweixin-1.0.0.js"></script>
    
    let that = this
    if (window.WeixinJSBridge) {
        WeixinJSBridge.invoke('getNetworkType', {}, function (e) {
            video.play()
        }, false);
    } else {
        document.addEventListener("WeixinJSBridgeReady", function () {
            WeixinJSBridge.invoke('getNetworkType', {}, function (e) {
                video.play()
            });
        }, false);
    }
    
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16

# # 3.视频开始短暂黑屏

部分android机型点击播放视频时,会出现短暂1~2s的黑屏。该问题出现可能是还没请求完成可顺利播放的视频。

解决方案:在视频上叠加一个div,把它的背景图换成首帧图。监听timeupdate事件,有视频播放时移除该div。

    <div @click="play">
          <video
            ref="video"
            :class="{'playing': playing}"
            :poster="startSource"
            x-webkit-airplay="allow"
            x5-video-player-type="h5"
            x5-playsinline
            webkit-playsinline playsinline>
            <source :src="videoSource" type="video/mp4" />
          </video>
          <div :class="['cover-start']" v-if="!playing"></div>
        </div>
    
1
2
3
4
5
6
7
8
9
10
11
12
13
14
    this.videoNode.addEventListener('timeupdate', () => {
        // 当视频的currentTime大于0.1时表示黑屏时间已过,已有视频画面,可以移除浮层
        if (this.videoNode.currentTime > 0.1 && !this.playing) {
            this.playing = true
        }
    }, false)
    
1
2
3
4
5
6
7

# # 4.部分Android机跳到x5 player播放视频

有些android在微信或浏览器,播放视频会跳到x5 player播放器中。这种video位于页面最顶层,无法被遮盖,说不定播完会推送腾讯视频信息,而且不会自动关掉。

解决方案:利用timeupdate事件,当视频快要结束时,手动remove掉整个视频。

    this.videoNode.addEventListener('timeupdate', () => {
        // 兼容Android X5在浏览器行为.时间为视频时长
        if (this.videoNode.currentTime > 56.9) {
            this.isShowVideo = false
        }
    }, false)
    
1
2
3
4
5
6
7

# # 5.视频canplay的坑

换了引导用户的视频方案后,前面有个loading页面。产品希望视频加载好后,loading消失并视频可点击。但是ios下canplay和canplaythrough事件都不会执行回调。ios是点击播放后才会去加载视频流。android下会执行canplay事件回调,但视频流也是边下边播。所以无法准确获得视频可加载时间点

总结:H5现在视频标准不完善,除了timeupdate、ended事件外,其他事件慎用。

# # 6.safari可以缩放视频

通常情况在meta的viewport中设置user-scalable=no即可。但是IOS 10以后的safari中,apple为了提高Safari中网站的辅助功能,即使网站在视口中设置该属性,用户也可以手动缩放。

解决方案:

    // IOS10 Safari不识别meta,故需要js hack
    document.documentElement.addEventListener('touchstart', function (event) {
    if (event.touches && event.touches.length > 1) {
        event.preventDefault()
    }
    }, false)
    
1
2
3
4
5
6
7
编辑 (opens new window)
Electron工程踩坑记录
Puppeteer翻页爬虫

← Electron工程踩坑记录 Puppeteer翻页爬虫→

最近更新
01
theme-vdoing-blog博客静态编译问题
09-16
02
搜索引擎
07-19
03
友情链接
07-19
更多文章>
Theme by Vdoing | Copyright © 2019-2022 Evan Xu | MIT License
  • 跟随系统
  • 浅色模式
  • 深色模式
  • 阅读模式