自动播放策略

按 MDN 的说法,video 的 autoplay 控制视频的自动播放。

<video src="/videos/awesomevid.mp4" autoplay>

但因为默认自动播放比较打扰用户,所以还需满足以下条件之一才能自动播放,以实现更好的用户体验。

  • 视频静音(通过加上 muted 属性)或音量设置为 0
  • 用户与网站进行了交互(通过点击、敲击、按键等)
  • 站点已被列入浏览器白名单;
  • 浏览器确定用户频繁使用媒体,自动加入白名单
  • 或者通过首选项
  • 或其他用户界面功能手动发生
  • 自动播放功能策略授予了 <iframe> 及其文档自动播放支持。
  • 另外,chromium 内核的浏览器满足以下条件,也可以自动播放。

  • 用户已将该站点添加到其移动设备的主屏幕
  • 或在桌面设备上安装了 PWA。
  • 当前(2021-08)浏览器内核主要有 webkit (safari)、chromium(chrome、edge),内核的自动播放策略决定了浏览器外在的视频自动播放表现。具体的更新策略可以参考以下的文档。(ps,主要是真的懒得一个个翻译了……)

  • chromium Autoplay policy in Chrome,2017-09-13 发布, 2021-05-25 更新
  • chromium www.chromium.org/audio-video… , 2018-10-22 更新
  • webkit Auto-Play Policy Changes for macOS,2017-07-08 发布
  • webkit New video Policies for iOS,2016-07-25 发布
  • 这些文章比较详细的介绍了自动播放策略的变更历史及相应的条件。

    1、自动播放兜底

    不要信任浏览器会自动播放,因为这玩意就是薛定谔的猫。所以我们最好加上一个 play 方法兜底,手动触发自动播放,并在失败的时候做些界面上的反馈。譬如出现重播或开启播放的按钮。

    var promise = document.querySelector('video').play();
    if (promise !== undefined) {
        promise.catch(error => {
            // Auto-play was prevented
            // Show a UI element to let the user manually start playback
        }).then(() => {
            // Auto-play started
    

    2、安卓微信内自动播放的兜底

    截止当前(2021-08)安卓微信内自动播放现在是不被支持的,即便 video 静音了,也不行。为什么会出现这个特殊的情况,是因为安卓微信内核为 X5 内核,猜测是它的行为并没有同步最新的 chromium。

    需要做一些兜底策略,可能如下:

  • 如果是静音视频展示的场景,可以考虑针对安卓微信展示相同效果的 gif
  • 非静音视频效果,默认展示明显的诱导开始播放的按钮
  • 忽略不管,等待用户触发网页行为后,再手动开启 play 方法
  • 3、全屏处理

    某些移动端浏览器自动播放时,会开启全屏。如果是理想的产品视觉效果,当然无可厚非。但如果想要禁用播放全屏,需要考虑加上 playsinline 属性以做兼容。腾讯 x5 内核下,还需要开启同层渲染 x5-video-player-type='h5-page',避免全屏。

    <video
        autoplay
        src={videoUrl}
        webkit-playsinline="true"
        playsinline="true"
        x5-video-player-type='h5-page'
    

    iframe 内 video 自动播放

    iframe 的情况自己没有上机研究过,具体可以参考 autoplay/#iframe-delegation

    分类:
    前端
    标签: