likes
comments
collection
share

video autoplay 自动播放之研究

作者站长头像
站长
· 阅读数 5

自动播放策略

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

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

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

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

另外,chromium 内核的浏览器满足以下条件,也可以自动播放。

  • 用户已将该站点添加到其移动设备的主屏幕
  • 或在桌面设备上安装了 PWA。

当前(2021-08)浏览器内核主要有 webkit (safari)、chromium(chrome、edge),内核的自动播放策略决定了浏览器外在的视频自动播放表现。具体的更新策略可以参考以下的文档。(ps,主要是真的懒得一个个翻译了……)

这些文章比较详细的介绍了自动播放策略的变更历史及相应的条件。

最佳实践

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