视频自动播放在Safari和Chrome桌面浏览器中不起作用


134

我花了很多时间试图弄清楚为什么像这样嵌入视频:

<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。


有时奏效吗?还是根本无法使用...这是我用chrome检查的示例w3schools.com/tags/tryit.asp?filename=tryhtml5_video_autoplay,它可以正常工作。
tanaydin

在某些页面上,它根本不起作用
Adam Bubela

面对同样的问题,一周前运行良好,并且没有任何更改,它就停止了工作。也许这是浏览器的更新,非常讨厌不得不通过javascript手动播放所有视频标签
bingeScripter

在Chrome中不适用于我。
建造者鲍勃(Bob the Builder)

Answers:


260

我能得到的最佳解决方案是在 </video>

<script>
    document.getElementById('vid').play();
</script>

...不是很漂亮,但是可以正常工作。

更新 最近,许多浏览器只能在没有声音的情况下自动播放视频,因此您也需要向muted视频标签添加属性

<video autoplay muted>
...
</video>

1
或者你可以用jQuery代码$("videoID").get(0).play(); stackoverflow.com/questions/4646998/...
企鹅

8
还是这样:$("video[autoplay]").each(function(){ this.play(); });
马丁

2
如果它没有静音,仍然会出现问题developer.google.com/web/updates/2017/09/…–
dovid

5
没有用户互动,这将不再起作用AFAIK
webkit,


93

play()按照其他答案的建议使用jQuery 或DOM操作后,它在Android版Chrome(版本56.0)中仍然无法正常工作(视频无法自动播放)。

按本岗位developers.google.com,从Chrome浏览器53,自动播放选项是由浏览器的尊重,如果视频静音

因此,autoplay muted在video标签中使用属性可以使视频从版本53开始在Chrome浏览器中自动播放。

摘自上面的链接:

从53版开始,Chrome安卓系统支持视频的静音自动播放。如果同时设置了autoplay和,muted则视频元素的播放会自动开始播放。

<video autoplay muted>
    <source src="video.webm" type="video/webm" />
    <source src="video.mp4" type="video/mp4" />
</video>
  • iOS 10及更高版本上的Safari支持静音自动播放。
  • Firefox和UC浏览器已在Android上支持自动播放(无论是否静音):它们不会阻止任何类型的自动播放。

3
我在Safari 11中遇到了这个问题,其中背景视频(无音频)无法自动播放。添加mutedautoplay完成了技巧。谢谢!
dmbaughman

1
那么,为什么声音自动播放功能在YouTube上仍然有效?自站点创建以来,它一直以这种方式工作。
Xavier

32

碰巧Safari和Desktop上的Chrome不喜欢围绕视频标签进行DOM操作。即使在初始页面加载后视频标签周围的DOM发生更改时cancanthrough事件已触发,当设置autoplay属性时,它们也不会触发播放顺序。基本上,我一直遇到相同的问题,直到我删除了视频标签周围的.wrap()jQuery,然后按预期方式自动播放了。


2
好话说,它不适用于.wrap()。但是,据我所知,代码需要.get(0)才能工作:$(“#vid”)。get(0).play();
mattsoave

3
@mattsoave .get(0)还是$('#vid')[0].play()
pmrotule,

2017年10月,尽管标签中有属性,但视频仍无法自动播放仍是Safari中的问题。使用mattsoave / pmrotule建议的[0] .play()解决了这个问题。
唐库伦

25

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>

约翰·帕列特(John Pallett)对新政策评论。他是Google Chrome浏览器的产品经理和Media Muter
Doomjunky

24

对我来说,问题在于该muted属性需要在video标记中添加。即:

<video width="1920" height="1980" src="video/Night.mp4"
type="video/mp4" frameborder="0" allowfullscreen autoplay loop
muted></video>`

适用于Windows8上的最新Chrome浏览器
vladkras

在Crome上,如果我添加了静音的禁用声音。我不想要这个
lisarko8077 '18年


12

我的影片现在也遇到了同样的问题

<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”,则视频将正常启动


如果存在自动播放功能,浏览器将忽略preload属性。
塞达(SedatBaşar)'19年

9

在页面底部添加以下代码对我有用。我不知道它为什么起作用:(

 setTimeout(function(){
     document.getElementById('vid').play();
 },1000);

2
原因是因为您正在等待视频在缓冲区中加载然后播放。
约瑟夫·布里格斯


5

var video = document.querySelector('video'); video.muted = true; video.play()

只有这个解决方案对我有帮助,<video autoplay muted ...>...</video>但是没有用...


3

没有其他答案对我有用。我的解决方法是触发视频本身的点击;hacky(由于需要超时),但效果很好:

function startVideoIfNotStarted () {
    $(".id_of_video_tag").ready(function () {
        window.setTimeout(function(){
            videojs("id_of_video_tag").play()
        }, 1000);
    });
}
$(startVideoIfNotStarted);

Chrome上的任何功能都不适合我。通过上面的.play()修复(破解),我得到了“未捕获(承诺)的DOMException:play()请求被对pause()的调用中断了”。在控制台中。页面上还有其他一些jQuery函数,因此认为计时器可以给Chrome足够的时间进行自我整理。有效。我在$(document).ready()中设置了0.5秒的计时器
从Orbonia

3

我们最近针对嵌入式视频解决了类似的问题,发现自动播放和静音属性不足以实现我们的实现。

我们在代码中添加了第三个“ playsinline”属性,它为iOS用户解决了该问题。

此修复程序特定于要内联播放的视频。从https://webkit.org/blog/6784/new-video-policies-for-ios/

在iPhone上,现在将允许元素内联播放,并且在开始播放时不会自动进入全屏模式。没有playinline属性的元素将继续需要全屏模式才能在iPhone上播放。当以捏合手势退出全屏时,没有播放内联的元素将继续内联播放。



2

试试这个:

    <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>

这就是我通常的做法。循环,控件和自动播放不需要值,它们是布尔属性。


2

这是因为现在chrome阻止了html5视频中的自动播放,因此默认情况下,它们将不允许自动播放。因此我们可以使用Chrome标志设置更改此设置。对于正常情况,这是不可能的,所以我找到了另一种解决方案。这是完美的工作...(添加preload =“ auto”)

<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();  

2

花了两个小时尝试上述所有解决方案。

这终于对我有用:

var vid = document.getElementById("myVideo");
vid.muted = true;

1

在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的用户手势和视频政策的更多信息:

https://webkit.org/blog/6784/new-video-policies-for-ios/


0

我遇到了一种情况,它与不同文件类型的顺序有关。尝试更改它,看看是否有帮助。


0

我从播放所有可见视频开始,但是旧手机的效果不佳。因此,现在我播放最靠近窗口中心的一个视频,然后暂停其余视频。香草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();
}

0

我解决了同样的问题,

$(window).on('pageshow',function(){
    var vids = document.querySelectorAll('video');
    for (var i = 0; i < vids.length;){
        vids[i].play();
    }
})

页面显示后,您必须启动视频。


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.