如何处理“未捕获(承诺)的DOMException:play()失败,因为用户没有首先与文档进行交互。” 在装有Chrome 66的台式机上?


122

我收到错误消息。

未捕获(承诺)的DOMException:play()失败,因为用户没有首先与文档进行交互。

..当尝试使用Chrome 66版在桌面上播放视频时。

我确实找到了一个广告,该广告开始使用以下HTML在网站上自动播放:

<video
    title="Advertisement"
    webkit-playsinline="true"
    playsinline="true"
    style="background-color: rgb(0, 0, 0); position: absolute; width: 640px; height: 360px;"
    src="http://ds.serving-sys.com/BurstingRes/Site-2500/Type-16/1ff26f6a-aa27-4b30-a264-df2173c79623.mp4"
    autoplay=""></video>

那么,绕过Chrome的V66的自动播放拦截真的那么容易,因为只需添加webkit-playsinline="true"playsinline="true"autoplay=""属性的<video>元素?这有负面影响吗?


2
我认为playsinline是iOS设备。
Josh Lee

Answers:


125

要在chrome 66更新后使html 5元素上的自动播放生效,您只需要将该muted属性添加到video元素即可。

因此,您当前的视频HTML

<video
    title="Advertisement"
    webkit-playsinline="true"
    playsinline="true"
    style="background-color: rgb(0, 0, 0); position: absolute; width: 640px; height: 360px;"
    src="http://commondatastorage.googleapis.com/gtv-videos-bucket/sample/BigBuckBunny.mp4"
    autoplay=""></video>

只是需要 muted="muted"

<video
    title="Advertisement"
    style="background-color: rgb(0, 0, 0); position: absolute; width: 640px; height: 360px;"
    src="http://commondatastorage.googleapis.com/gtv-videos-bucket/sample/BigBuckBunny.mp4"
    autoplay="true"
    muted="muted"></video>

我相信chrome 66更新试图阻止标签页在用户标签上创建随机噪音。这就是为什么静音属性使自动播放再次起作用的原因。


将我的头发拉出一个小时后。这解决了我的问题
Andy McCormick

在视频开始播放后,有没有一种方法可以启用音频?删除mute属性或设置volume属性无济于事。
nikitahl

在MacOs Chrome版本74.0.3729.131上,两个代码片段均出现黑屏
KamilKiełczewski,

@KamilKiełczewski该视频显示黑屏,因为该视频src无效。我已经更新了代码段,src因此视频会自动播放。

2
我不得不这样做muted="true",而不是
tgordon18

13

我发现的最佳解决方案是将视频静音

的HTML

<video loop muted autoplay id="videomain">
  <source src="videoname.mp4" type="video/mp4">
</video>

12
  1. 打开 chrome://settings/content/sound
  2. 设置无需用户手势
  3. 重新启动Chrome

6
自动播放政策更改。点击我

4
它仅用于开发人员在本地测试Chrome自动播放策略行为。developers.google.com/web/updates/2017/09/...
疃阮

5
我发现命令行标志--autoplay-policy=no-user-gesture-required是实现此设置的编程方式。
nickiaconis

27
这仅适用于您的浏览器,其他所有人仍然会受到影响
koosa

37
谁在支持这个答案?这不是superuser.com。不能为您的本地计算机提供解决方案。
adripanico

11

回答眼前的问题...
不,拥有这些属性还不够,要能够自动播放带音频的媒体,您需要在文档上注册用户手势。

但是,此限制非常弱:如果您确实在父文档上收到了该用户手势,并且您的视频是从iframe加载的,则可以播放...

因此,以这个小提琴为例,

<video src="myvidwithsound.webm" autoplay=""></video>

初次加载时,如果您未单击任何位置,它将无法运行,因为我们尚未注册任何事件。
但是,一旦单击“运行”按钮,父文档(jsfiddle.net)确实会收到用户手势,即使技术上将其加载到其他文档中,现在也可以播放该视频。

但是以下代码段将自动播放,因为它需要您实际单击“ 运行代码段”按钮。

<video src="https://upload.wikimedia.org/wikipedia/commons/transcoded/2/22/Volcano_Lava_Sample.webm/Volcano_Lava_Sample.webm.360p.webm" autoplay=""></video>

这意味着您的广告可能能够播放,因为您确实在主页上提供了用户手势。


现在,请注意Safari和Mobile Chrome的规则更严格,并且将要求您至少在用户事件处理程序本身play()<video><audio>元素上以编程方式实际触发至少一次方法。

而且,如果您不需要音频,只需将其不附加到媒体上,也可以自动播放仅包含视频轨道的视频,这将减少用户的带宽使用量。


11

对于我(在Angular项目中),此代码帮助:

在HTML中,您应该添加 autoplay muted

在JS / TS中

playVideo() {
    const media = this.videoplayer.nativeElement;
    media.muted = true; // without this line it's not working although I have "muted" in HTML
    media.play();
}

1
即使使用最新的Angular版本的Ng8,也绝对真实且令人难以置信。Angular根本不在乎组件的HTML模板发生了什么!
Pedro Ferreira

2
并且,使用新的Angular的使用方式,@ViewChild()您需要将sttatic选项设置为true: @ViewChild('videoPlayer', {static: true}) videoplayer: ElementRef; video: HTMLVideoElement; 然后: this.video = this.videoplayer.nativeElement;@ngOnInit()
Pedro Ferreira

1
这是我的问题,完全忽略了HTML中的静音,我不得不由JS强制使用。经过几天的搜索,您的答案+ 1M
Ignacio Bustos

在我的情况下,这是正确的答案,效果很好
Harry .Naeem

哇,简直无法相信我确实需要Angular SSR后加载视图的javascript端静音。在整个过程中,我都认为HTML是问题所在。
arao6

7

尝试使用mousemove事件lisentner

var audio = document.createElement("AUDIO")
document.body.appendChild(audio);
audio.src = "./audio/rain.m4a"

document.body.addEventListener("mousemove", function () {
    audio.play()
})

4

扩展DOM元素,处理错误并优雅地降级

在下面,我使用原型函数包装本地DOM播放函数,抓住其诺言,然后在浏览器抛出异常时降级为播放按钮。该扩展解决了浏览器的缺点,并且在知道目标元素的情况下可以在任何页面中即插即用。

// JavaScript
// Wrap the native DOM audio element play function and handle any autoplay errors
Audio.prototype.play = (function(play) {
return function () {
  var audio = this,
      args = arguments,
      promise = play.apply(audio, args);
  if (promise !== undefined) {
    promise.catch(_ => {
      // Autoplay was prevented. This is optional, but add a button to start playing.
      var el = document.createElement("button");
      el.innerHTML = "Play";
      el.addEventListener("click", function(){play.apply(audio, args);});
      this.parentNode.insertBefore(el, this.nextSibling)
    });
  }
};
})(Audio.prototype.play);

// Try automatically playing our audio via script. This would normally trigger and error.
document.getElementById('MyAudioElement').play()

<!-- HTML -->
<audio id="MyAudioElement" autoplay>
  <source src="https://www.w3schools.com/html/horse.ogg" type="audio/ogg">
  <source src="https://www.w3schools.com/html/horse.mp3" type="audio/mpeg">
  Your browser does not support the audio element.
</audio>

这是一种非常聪明的方法,不会破坏任何策略(因为无论如何都不会开始播放),并且可以避免出现错误。+1
loretoparisi

3

就我而言,我必须这样做

 // Initialization in the dom
 // Consider the muted attribute
 <audio id="notification" src="path/to/sound.mp3" muted></audio>


 // in the js code unmute the audio once the event happened
 document.getElementById('notification').muted = false;
 document.getElementById('notification').play();

2

Chrome需要用户互动,视频才能通过js(video.play())自动播放或播放。但是,互动可以随时随地进行。如果您仅在页面上单击随机,视频将自动播放。然后我解决了,添加了一个按钮(仅在Chrome浏览器上),该按钮显示“启用视频自动播放”。该按钮不执行任何操作,仅单击它便是任何其他视频所需的用户交互。


1

尝试播放音频文件时遇到类似的错误。最初,它正在工作,然后当我开始markForCheck在同一函数中使用ChangeDetector的方法以在承诺解决后触发重新渲染时停止工作(我对视图渲染存在问题)。

当我更改为时markForCheckdetectChanges它又开始工作了。我真的无法解释发生了什么,我只是想把它放到这里,也许会有所帮助。


1

您应该mutedvideoElement代码内部按预期方式添加属性。看下面..

<video id="IPcamerastream" muted="muted" autoplay src="videoplayback%20(1).mp4" width="960" height="540"></video>

别忘了添加有效的视频链接作为源


0

我在Android手机上玩时遇到一些问题。经过几次尝试,我发现打开Data Saver时不会自动播放:

如果启用了数据保护程序模式,则不会自动播放。如果启用了数据保护程序模式,则在媒体设置中将禁用自动播放。

资源


-6

键入的Chrome://标志在地址栏

搜索:自动播放

自动播放政策

决定是否允许音频或视频自动播放时使用的策略。

– Mac,Windows,Linux,Chrome OS,Android

将此设置为“ 不需要用户手势

重新启动Chrome,您无需更改任何代码


24
您不可能要求每个用户都更改设置。
Ashish Jhanwar

2
这实际上可以解决某些人的问题(信息亭,私人和本地网站...),但是在Chrome 76中已删除该标志。现在唯一的解决方案是此答案
MilanŠvehla19年
By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.