想让<video>既不弹窗又能自动播放,怎么这么难

809 阅读3分钟

我正在参加「掘金·启航计划」

想让<video>既不弹窗又能自动播放,怎么这么难

  如果你曾在移动端的页面里用过<video>做一些动效,就会深感世界的不易,为什么,为什么一个简简单单的视频在ios和android,在app站内和站外,在微信内,会有这么多的差异?

  这些差异里最直观影响体验的当属ios的弹窗播放和两边的自动播放了,我一个动效,难道还要用户点一下屏幕才能播吗?

  是坑就要有人踩,那么接下来,请看我的踩坑记录。

关于自动播放

  最终也没有攻克成功的是 「android微信」,怎么也无法自动播放。如果有朋友成功攻克了这个难题,请务必告诉我解决的思路,感谢。

1. 端内-最好也是最难解决

  好解决在,只需要app端修改一下webview的这个属性,就完事大吉了。

 webview.mediaPlaybackRequiresUserAction = false

  难解决也是在此,需要依赖客户端发版的解决方案,不能算是个最优的解法。这里有一个性能相对降低但不依赖客户端的解法,可供参考: GitHub - phoboslab/jsmpeg at b5799bfc213c7732e1f68754d9244f47258d8be5   赫赫有名(5.9k star)的视频解析库,可用于视频直播或点播,特色是高兼容、低延迟。原理是通过拉取视频流,将其用webGL一帧帧渲染在页面上。跟set video.currentTime相比,直接操作更底层的要素,所以性能相对好一些。

  使用时需要注意:

  1. jsmpeg只能解析.ts文件,而且是规范的ts文件,所以需要自己做先行转换,建议使用ffmpeg。
  2. 转换的指令如下(需要先安装ffmpeg)(注意转换出来的尺寸):
ffmpeg -i in.mp4 -f mpegts \
        -codec:v mpeg1video -s 960x540 -b:v 1500k -r 30 -bf 0 \
        -codec:a mp2 -ar 44100 -ac 1 -b:a 128k \
        out.ts

2. 普通站外

  理论上来说,只需要autoplaymuted两个属性即可

3. 微信内-奇妙的解决方案,但有用

   引入微信的sdk,并且等到wx.ready再初始视频标签

   说实话,真不知道为啥有用,估计是微信自己内部做了啥?但是亲测这样可以在ios的微信内自动播放(android别想了)。我的微信版本是8.0.29,同事们的微信测试也都没有问题,所以…就这么记吧。

另外需要注意的两点是:

  1. 如果你跟我一样,在本地环境可以正常load wx的sdk,但测试和生产环境不行,把这个js下载下来换成自己的域名。猜测是跟安全域名有关,但,也不会报错,只会超时。
  2. 初始化的时候,video标签可以设置透明度,但是不要没有。也即是,可以v-show,但不要v-if。不然会播不了。
        loadJsPromise('http://res.wx.qq.com/open/js/jweixin-1.6.0.js')
          .then(() => {
            window.wx.ready(() => {
              // 开始初始化video标签
            });
          })

关于行内播放

对应关键词,不全屏播放

1. 端内

webview.allowsInlineMediaPlayback = true 

参考上面的自动播放,那个也可以。

2. 端外

   这一堆属性糊上去。

        autoPlay={true}
        muted={true}
        controls={false}
        playsInline={true}
        webkit-playsinline=“truex5-playsinline=“truex5-video-player-type=“h5”
        x5-video-player-fullscreen=“portraint”
        x-webkit-airplay=“allow”

  大略起效果的对应关系是:

  • safari
    • webkit-playsinline
    • playsinline
  • 微信
    • x5-video-player-type=“h5”
    • x5-video-player-fullscreen=“portraint”
    • x5-playsinline=“true”

  综上所述,视频作为一个90分的动效载体,可以说除了兼容性需要多费心之外什么都好,如果要用的话,坑,我先踩为敬。