[英]Video auto play is not working in Safari and Chrome desktop browser
我花了很多时间试图弄清楚为什么视频嵌入在这里:
<video height="256" loop autoplay muted controls id="vid">
<source type="video/mp4" src="video_file.mp4"></source>
<source type="video/ogg" src="video_file.ogg"></source>
</video>
一旦页面在 FireFox 中加载,就会自动开始播放,但不能在基于 Webkit 的浏览器中自动播放。 这仅发生在一些随机页面上。 到目前为止,我无法找到原因。 我怀疑 CMS 编辑器创建了一些未关闭的标签或大量 JS。
我能得到的最好解决方法是在</video>
之后添加此代码
<script>
document.getElementById('vid').play();
</script>
...不漂亮,但不知何故有效。
更新最近很多浏览器只能在关闭声音的情况下自动播放视频,因此您也需要在视频标签中添加muted
属性
<video autoplay muted>
...
</video>
按照其他答案的建议使用 jQuery play()
或 DOM 操作后,它在 Android 版 Chrome(56.0 版)中仍然无法正常工作(视频未自动播放)。
根据developers.google.com 中的这篇文章,从Chrome 53 开始,如果视频静音,浏览器会尊重自动播放选项。
因此,在视频标签中使用autoplay muted
属性可以让视频在 Chrome 浏览器中自动播放 53 版。
摘自上述链接:
自版本 53 起,Android 版 Chrome 支持静音自动播放视频。如果设置了
autoplay
和muted
视频元素将自动开始autoplay
[...]<video autoplay muted> <source src="video.webm" type="video/webm" /> <source src="video.mp4" type="video/mp4" /> </video>
- iOS 10 及更高版本上的 Safari 支持静音自动播放。
- Firefox 和 UC 浏览器已经在 Android 上支持自动播放,无论是否静音:它们不会阻止任何类型的自动播放。
Google 刚刚更改了自动播放视频的政策,必须将其
muted
你可以在这里查看
所以只需添加静音
<video height="256" loop="true" autoplay="autoplay" controls="controls" id="vid" muted>
<source type="video/mp4" src="video_file.mp4"></source>
<source type="video/ogg" src="video_file.ogg"></source>
</video>
碰巧桌面上的 Safari 和 Chrome 不喜欢围绕视频标签的 DOM 操作。 即使在初始页面加载后视频标记周围的 DOM 发生更改时触发了 canplaythrough 事件,它们也不会在设置 autoplay 属性时触发播放顺序。 基本上我遇到了同样的问题,直到我删除了视频标签周围的 .wrap() jQuery,然后它按预期自动播放。
对我来说,问题是需要在video
标签中添加muted
属性。 IE:
<video width="1920" height="1980" src="video/Night.mp4"
type="video/mp4" frameborder="0" allowfullscreen autoplay loop
muted></video>`
Chrome 不允许自动播放带声音的视频,因此请确保像这样向video
标签添加muted
属性
<video width="320" height="240" autoplay muted>
<source src="video.mp4" type="video/mp4">
</video>
我的视频现在遇到了同样的问题
<video preload="none" autoplay="autoplay" loop="loop">
<source src="Home_Teaser.mp4" type="video/mp4">
<source src="Home_Teaser" type="video/webm">
<source src="Home_Teaser.ogv" type="video/ogg">
</video>
经过搜索,我找到了一个解决方案:
如果我将“preload”属性设置为“true”,则视频正常启动
var video = document.querySelector('video');
video.muted = true;
video.play()
只有这个解决方案对我有帮助, <video autoplay muted ...>...</video>
不起作用...
试试这个:
<video width="320" height="240" autoplay muted>
<source src="video.mp4" type="video/mp4">
</video>
在页面底部添加以下代码对我有用。 我不知道它为什么有效:(
setTimeout(function(){
document.getElementById('vid').play();
},1000);
Google 更新了自动播放政策。 自动播放仅适用于静音模式。 检查链接https://developers.google.com/web/updates/2017/09/autoplay-policy-changes
在 Safari iPhone 上,当电池电量低且 iPhone 处于低电量模式时,它不会自动播放,即使您具有以下属性:自动播放、循环、静音、在您的视频 html 标签上设置的内联播放。
四处走走我发现工作是让用户手势事件触发视频播放:
document.body.addEventListener("touchstart", function () {
var allVideos = document.querySelectorAll('video');
for (var i = 0; i < allVideos.length; i++) {
allVideos[i].play();
}
},{ once: true });
您可以在 webkit 站点中阅读有关 iOS 的用户手势和视频策略的更多信息:
我们最近解决了嵌入视频的类似问题,发现 autoplay 和 muted 属性不足以满足我们的实施。
我们在代码中添加了第三个“playsinline”属性,它为 iOS 用户解决了这个问题。
此修复特定于要内联播放的视频。 来自https://webkit.org/blog/6784/new-video-policies-for-ios/ :
在 iPhone 上,元素现在将被允许内联播放,并且在播放开始时不会自动进入全屏模式。 没有 playsinline 属性的元素将继续需要全屏模式才能在 iPhone 上播放。 当使用捏合手势退出全屏时,没有 playinline 的元素将继续内联播放。
我把它静音了,让它自动播放。 我认为谷歌规则不会让 Chrome 自动播放,除非它被静音。
<video id="video" controls autoplay muted
border:0px solid black;"
width="300"
height="300">
<source src="~/Videos/Lumen5_CTAS_Home2.mp4"
type="video/mp4" />
Your browser does not support the video tag.
Please download the mp4 plugin to see the CTAS Intro.
</video>
其他答案都不适合我。 我的解决方法是触发对视频本身的点击; hacky(因为需要超时)但它工作正常:
function startVideoIfNotStarted () {
$(".id_of_video_tag").ready(function () {
window.setTimeout(function(){
videojs("id_of_video_tag").play()
}, 1000);
});
}
$(startVideoIfNotStarted);
花了两个小时尝试上述所有解决方案。
这最终对我有用:
var vid = document.getElementById("myVideo");
vid.muted = true;
试试这个:
<video height="256" loop autoplay controls id="vid">
<source type="video/mp4" src="video_file.mp4"></source>
<source type="video/ogg" src="video_file.ogg"></source>
这就是我通常的做法。 循环、控件和自动播放不需要值,它们是布尔属性。
这是因为现在 chrome 禁止在 html5 视频中自动播放,所以默认情况下它们不允许自动播放。 因此我们可以使用 chrome 标志设置更改此设置。 这在正常情况下是不可能的,所以我找到了另一种解决方案。 这是完美的......(添加预加载=“自动”)
<video autoplay preload="auto" loop="loop" muted="muted" id="videoBanner" class="videoBanner">
<source src="banner-video.webm" type="video/webm">
<source src="banner-video.mp4" type="video/mp4">
<source src="banner-video.ogg" type="video/ogg">
var herovide = document.getElementById('videoBanner');
herovide.autoplay=true;
herovide.load();
在 iPhone 上的 Safari 上播放视频时遇到问题。 在video
标签中添加playsinline
属性就可以解决这个问题,而且有效!
<video autoplay muted loop playsinline class="someClass">
<source src="source.mp4" type="video/mp4">
</video>
你也会在 OSX 上的 Safari 上遇到这个问题,以防你对这个属性playsinline
感到困惑,这里是解释。
在移动浏览器中,
playsinline
将在原处播放视频,而不是默认播放,即在播放时全屏打开。
对于 OSX 上的 Safari,由于默认网站Auto-Play
选项是Stop Media with Sound
,此策略也会引入权限问题。
这就是为什么我们需要属性muted
。
尝试将autoPlay
换成autoplay
。
有时似乎区分大小写。 非常奇怪,因为它对我来说是autoplay
的,但autoplay
是我包含了controls
角度 10:
<video [muted]="true" [autoplay]="true" [loop]="true">
<source src="/assets/video.mp4" type="video/mp4"/>
</video>
autoplay
词之前使用muted
关键字,这里是 2018 年 4 月的一些隐私更改。与muted
属性结合使用时,它对我muted
<video onload='this.play()' src='the source' autoplay controls></video>
这对我有用。
我有一个案例,它与不同文件类型的顺序有关。 尝试更改它,看看是否有帮助。
我开始播放所有可见的视频,但旧手机的表现不佳。 所以现在我播放最靠近窗口中心的一个视频并暂停其余的视频。 香草JS。 您可以选择您喜欢的算法。
//slowLooper(playAllVisibleVideos);
slowLooper(playVideoClosestToCenter);
function isVideoPlaying(elem) {
if (elem.paused || elem.ended || elem.readyState < 2) {
return false;
} else {
return true;
}
}
function isScrolledIntoView(el) {
var elementTop = el.getBoundingClientRect().top;
var elementBottom = el.getBoundingClientRect().bottom;
var isVisible = elementTop < window.innerHeight && elementBottom >= 0;
return isVisible;
}
function playVideoClosestToCenter() {
var vids = document.querySelectorAll('video');
var smallestDistance = null;
var smallestDistanceI = null;
for (var i = 0; i < vids.length; i++) {
var el = vids[i];
var elementTop = el.getBoundingClientRect().top;
var elementBottom = el.getBoundingClientRect().bottom;
var elementCenter = (elementBottom + elementTop) / 2.0;
var windowCenter = window.innerHeight / 2.0;
var distance = Math.abs(windowCenter - elementCenter);
if (smallestDistance === null || distance < smallestDistance) {
smallestDistance = distance;
smallestDistanceI = i;
}
}
if (smallestDistanceI !== null) {
vids[smallestDistanceI].play();
for (var i = 0; i < vids.length; i++) {
if (i !== smallestDistanceI) {
vids[i].pause();
}
}
}
}
function playAllVisibleVideos(timestamp) {
// This fixes autoplay for safari
var vids = document.querySelectorAll('video');
for (var i = 0; i < vids.length; i++) {
if (isVideoPlaying(vids[i]) && !isScrolledIntoView(vids[i])) {
vids[i].pause();
}
if (!isVideoPlaying(vids[i]) && isScrolledIntoView(vids[i])) {
vids[i].play();
}
}
}
function slowLooper(cb) {
// Throttling requestAnimationFrame to a few fps so we don't waste cpu on this
// We could have listened to scroll+resize+load events which move elements
// but that would have been more complicated.
function repeats() {
cb();
setTimeout(function() {
window.requestAnimationFrame(repeats);
}, 200);
}
repeats();
}
我解决了同样的问题,
$(window).on('pageshow',function(){
var vids = document.querySelectorAll('video');
for (var i = 0; i < vids.length;){
vids[i].play();
}
})
您必须在页面显示后启动视频。
试试这个,它既简单又简短,它适用于我的代码,而我有全屏视频,在其他元素后面我只是使用 z-index -1;
<video autoplay loop id="myVideo">
在 React + Chrome 中,导入视频比将其作为 src 提供给 .
import React from 'react';
import styled from 'styled-components';
import video from './videos.mp4';
const StyledVideo = styled.video`
width: 100%;
height: 100vh;
object-fit: cover;
`
const BackgroundVideo = () => {
return (
<StyledVideo autoPlay loop muted>
<source src={video} type="video/mp4" />
</StyledVideo>
);
}
记住
对于 angular,您必须将其静音并在ngAfterViewInit()
播放,如下所示
<video height="256" loop autoplay muted controls id="vid" #videoRef>
<source type="video/mp4" src="video_file.mp4"></source>
<source type="video/ogg" src="video_file.ogg"></source>
</video>
@ViewChild('videoRef', { static: true }) videoRef!: ElementRef
ngAfterViewInit(): void {
const media = this.videoRef.nativeElement
media.muted = true
media.play()
}
你应该经常查看 play 函数返回的 Promise 是否被拒绝
看答案,我写过一个类似的问题
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.