我的回答中没有真正的新答案——只是试图更新这个问题,并希望避免人们像我刚刚做的那样浪费一整天的时间。
据我所知(特别是因为这个问题太老了),当视频被动态添加到页面时,muted
它从未起作用。既然muted
不起作用,那么muted autoplay
也不会起作用。
我认为发生的情况是浏览器在页面加载时做出了某些决定,并且由于某些非常奇怪的原因,即使页面具有muted
属性,稍后添加到页面的视频也不会静音。我认为这是 Chrome 中的一个错误,在 Safari 中不会发生在我身上——但看起来我们现在被困住了。
谷歌关于自动播放/静音的博客条目只有一年的历史,并提供了以下见解:
Chrome 的自动播放策略很简单:
- 始终允许静音自动播放。
- 在以下情况下允许自动播放声音:
- 用户与域进行了交互(单击、点击等)。
- 在桌面上,用户的媒体参与指数阈值已被超过,这意味着用户之前播放过有声视频。
- 在移动设备上,用户已将网站添加到他或她的主屏幕。
- 顶级框架可以将自动播放权限委托给其 iframe 以允许自动播放声音。
只少了一件大事!
- “静音”HTML 属性仅在初始加载时 HTML 中存在视频时生效。这也适用于“自动播放静音”视频。
那么这有什么影响:
- 如果以编程方式播放没有声音的视频,则必须先将其静音。因此,如果将动态视频添加到页面,则必须
video.muted = true
在将其添加到 DOM 之后(或在播放之前)显式设置。
- 如果您尝试以
video.play()
编程方式执行(例如,当有人向下滚动经过静音视频并且您希望它播放时),则必须先将视频静音。
我在 Angular 中遇到了这个问题,并花了太多时间假设它与我使用模板的事实有关,或者与 Angular 相关。
我在 StackBlitz 上做了一个测试应用。您需要取消注释该行// video.muted = true
以使其正常工作。
https://stackblitz.com/edit/angular-ze4t9y
要实现的其他重要事项是:
- 即使视频实际上没有声音,也必须将其静音。如果需要,请使用“兔子”视频进行测试。
- 博客中概述的较新的“媒体参与”规则可能会在测试页面时让您感到困惑,因为您将与该页面进行交互。您必须做的是关闭浏览器,或以隐身模式打开一个新窗口 - 以重置此参与规则(请参阅博客条目)。
如果您在用户没有首先“参与”页面时尝试播放非静音视频,您将在浏览器中看到的错误如下所示。如果您在非静音视频中没有看到此消息,则 Chrome 可能已允许该视频播放,因为您与该页面进行了交互。
最后,如果您使用的是 Angular(所有内容都是动态添加的),则可以使用以下方法使视频静音:
@ViewChild('bunnyVideo', { read: ElementRef }) bunnyVideo: ElementRef;
然后当你想玩它时:
const video: HTMLVideoElement = this.bunnyVideo.nativeElement;
// explicitly mute it...
video.muted = true;
// ...before attempting to play
video.play().catch((err) => {
alert('video error ' + err);
});