浅谈一下浏览器视频自动播放策略

写在前面

有一次在做视频播放的时候,我想让页面打开的时候,视频就自动播放,不需要用户自己手动点击播放按钮,但是直接执行video的play方法,报错如下:

Uncaught (in promise) DOMException: play() failed because the user didn't interact with the document first.

大概意思就是因为用户没有与页面进行交互操作,经过测试等包括代码执行click一样的,均无效,必须是用户自己真实的页面操作。

寻找原因

那为什么我刷的网页抖音,可以直接播放呢? 浏览器video自动播放,它是有要求的,要在它的规则下才能自动播放,如下:MDN Autoplay guide for media and Web Audio APIs

浏览器觉得音频轨道的视频如果直接自动播放会打扰到用户,以下情况除外

image.png

之所以抖音,哔哩哔哩,可以自动播放是因为他们上了白名单,浏览器会根据这个页面打开次数,看视频的时长等等因素算出一个指数,指数高了这个地址才能拥有直接自动播放权限,这个我们开发者没有办法干涉。见下chrome://media-engagement/,复制在浏览器打开

1686920155061.png

那一开始抖音b站他们并不能自动播放,他们的方案是什么呢,我们可以根据第一条,如果视频是静音状态下就可以自动播放,所以抖音在自动播放的时候失败的时候,他会选择静音播放,提示打开声音,用户点击,于是有了第二个条件,视频就可以带着声音播放了。

所以解决这个问题步骤:

  1. 看是否能自动播放,如果可以正常播放
  2. 如果不行,则静音播放,引导用户进行点击,有交互行为

参考代码:


<!DOCTYPE html>

<html lang="en">

  <title>视频不能播放的问题</title>

  <style>

  * {

    margin: 0;

    padding: 0;

  }

  .mask {

    display: flex;

    position: absolute;

    left: 0;

    top: 0;

    background: rgba(0, 0, 0, 0.3);

    height: 360px;

    width: 640px;

    justify-content: center;

    align-items: center;

    visibility: hidden;

  }

  .on {

    visibility: visible;

  }

  button {

    background-color: #4CAF50;

    /* Green */

    border: none;

    color: white;

    padding: 16px 32px;

    text-align: center;

    text-decoration: none;

    display: inline-block;

    font-size: 16px;

    margin: 4px 2px;

    -webkit-transition-duration: 0.4s;

    /* Safari */

    transition-duration: 0.4s;

    cursor: pointer;

  }

    </style>

  <body>

    <video

      src="http://clips.vorwaerts-gmbh.de/big_buck_bunny.mp4"

      id="video"

      controls

      autoplay></video>

    <div class="mask">

      <button id="btn">打开声音</button>

    </div>

    <script>
    
  
    // video.play方法返回的是一个promise,失败会reject然后触发catch

    const play = async () => {

      try {

        await video.play()

        //  取消静音静音

        video.muted = false

      }

      catch (err) {
          // 添加蒙层和
        document.getElementsByClassName("mask")[0].classList.add("on")

        // 设置静音

        video.muted = true

        video.playbackRate = 10

        video.play()

      }

    }

  
    play()

    document.getElementById("btn").addEventListener("click", () => {

      play()

    })

        </script>

  </body>

</html>
全部评论

相关推荐

避坑恶心到我了大家好,今天我想跟大家聊聊我在成都千子成智能科技有限公司(以下简称千子成)的求职经历,希望能给大家一些参考。千子成的母公司是“同创主悦”,主要经营各种产品,比如菜刀、POS机、电话卡等等。听起来是不是有点像地推销售公司?没错,就是那种类型的公司。我当时刚毕业,急需一份临时工作,所以在BOSS上看到了千子成的招聘信息。他们承诺无责底薪5000元,还包住宿,这吸引了我。面试的时候,HR也说了同样的话,感觉挺靠谱的。于是,我满怀期待地等待结果。结果出来后,我通过了面试,第二天就收到了试岗通知。试岗的内容就是地推销售,公司划定一个区域,然后你就得见人就问,问店铺、问路人,一直问到他们有意向为止。如果他们有兴趣,你就得摇同事帮忙推动,促进成交。说说一天的工作安排吧。工作时间是从早上8:30到晚上18:30。早上7点有人叫你起床,收拾后去公司,然后唱歌跳舞(销售公司都这样),7:55早课(类似宣誓),8:05同事间联系销售话术,8:15分享销售技巧,8:30经理训话。9:20左右从公司下市场,公交、地铁、自行车自费。到了市场大概10点左右,开始地推工作。中午吃饭时间大约是12:00,公司附近的路边盖饭面馆店自费AA,吃饭时间大约40分钟左右。吃完饭后继续地推工作,没有所谓的固定中午午休时间。下午6点下班后返回公司,不能直接下班,需要与同事交流话术,经理讲话洗脑。正常情况下9点下班。整个上班的一天中,早上到公司就是站着的,到晚上下班前都是站着。每天步数2万步以上。公司员工没有自己的工位,百来号人挤在一个20平方米的空间里听经理洗脑。白天就在市场上奔波,公司的投入成本几乎只有租金和工资,没有中央空调。早上2小时,晚上加班2小时,纯蒸桑拿。没有任何福利,节假日也没有3倍工资之类的。偶尔会有冲的酸梅汤和西瓜什么的。公司的晋升路径也很有意思:新人—组长—领队—主管—副经理—经理。要求是业绩和团队人数,类似传销模式,把人留下来。新人不能加微信、不能吐槽公司、不能有负面情绪、不能谈恋爱、不能说累。在公司没有任何坐的地方,不能依墙而坐。早上吃早饭在公司外面的安全通道,未到上班时间还会让你吃快些不能磨蹭。总之就是想榨干你。复试的时候,带你的师傅会给你营造一个钱多事少离家近的工作氛围,吹嘘工资有多高、还能吹自己毕业于好大学。然后让你早点来公司、无偿加班、抓住你可能不会走的心思进一步压榨你。总之,大家在找工作的时候一定要擦亮眼睛,避免踩坑!———来自网友
qq乃乃好喝到咩噗茶:不要做没有专业门槛的工作
点赞 评论 收藏
分享
吴offer选手:HR:我KPI到手了就行,合不合适关我什么事
点赞 评论 收藏
分享
评论
点赞
收藏
分享

创作者周榜

更多
牛客网
牛客网在线编程
牛客网题解
牛客企业服务