javascript 用户手势后,视频不会自动播放音频

5jvtdoz2  于 2022-10-30  发布在  Java
关注(0)|答案(1)|浏览(220)

我有一个简单的网页,在一个轮播的不同幻灯片中有多个<video>元素。当一个视频在轮播的活动幻灯片中时,我会.play()接收该视频,并.pause()接收所有其他视频。我希望视频在静音状态下自动播放,并完全了解每个浏览器的自动播放策略。然而,即使在用户已经与网页交互(通过暂停/播放/取消静音播放的第一视频)之后,任何后续的视频也将由于以下错误而不能从静音播放:

The request is not allowed by the user agent or the platform in the current context, possibly because the user denied permission.

在用户与页面交互后,使视频播放静音的正确方法是什么?
我创建了一个codesandbox to reproduce the issue

var vid1 = document.getElementById("video1");
      var vid2 = document.getElementById("video2");
      var vid3 = document.getElementById("video3");

      carousel.on("slideChange", function () {
        vid1.currentTime = 0;
        vid2.currentTime = 0;
        vid3.currentTime = 0;
        vid1.pause();
        vid2.pause();
        vid3.pause();

        if (carousel.activeIndex === 0) {
          var currentVideo = vid1;
          var prevVideo = vid3;
        } else if (carousel.activeIndex === 1) {
          var currentVideo = vid2;
          var prevVideo = vid1;
        } else {
          var currentVideo = vid3;
          var prevVideo = vid2;
        }

        currentVideo.volume = 1;
        currentVideo
          .play()
          .catch((e) => {
            console.error(`Error playing: ${e.message}`);
            currentVideo.muted = true;
            return currentVideo
              .play()
              .catch((err) => console.error("Error caught again", err.message));
          })
      });

一些其他观察结果:

  • 这只发生在iOS上。Android和桌面浏览器按预期工作。
  • 在我播放和unumte每个视频后,当视频被重新访问时,它将正确地播放静音
ego6inou

ego6inou1#

问题是我们在touchmove之后监听touchend事件,这是滑动时注册的手势。但这并没有注册为允许iOS自动播放的用户手势。
规范中定义了 * 应该 * 允许自动播放的用户手势。通过测试,我发现允许自动播放的用户手势只有clickpointerupmouseuptouchendclick之后触发时也可以工作,但在touchmove之后就不行了。
了解如何正确处理defined by the Safari team中的用户手势也很重要:
关于用户手势要求的注意事项:当我们说一个动作必须“作为用户手势的结果”发生时,我们的意思是,例如,导致对www.example.com()的调用的JavaScriptvideo.play必须直接由touchend、click、doubleclick或keydown事件的处理程序产生video.play。})将满足用户手势要求。video.addEventListener('canplaythrough',()=〉{video.play(); })则不会。

相关问题