视频自动播放在Safari和Chrome桌面浏览器中无效

时间:2013-08-01 12:53:37

标签: javascript html5 google-chrome safari webkit

我花了很多时间试图找出像这里嵌入视频的原因:

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

26 个答案:

答案 0 :(得分:130)

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

之后添加此代码
<script>
    document.getElementById('vid').play();
</script>

......不漂亮,但不知何故有效。

<强>更新 最近,许多浏览器只能在关闭声音的情况下自动播放视频,因此您还需要在视频标记中添加muted属性

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

答案 1 :(得分:31)

桌面上的Safari和Chrome不喜欢视频标记周围的DOM操作。如果在初始页面加载后视频标记周围的DOM发生变化时触发了canplaythrough事件,则当autoplay属性设置为甚至时,它们不会触发播放顺序。基本上我遇到了同样的问题,直到我在视频标签周围删除了一个.wrap()jQuery,之后它按预期自动播放。

答案 2 :(得分:21)

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

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

答案 3 :(得分:18)

  
    

Google刚刚更改了自动播放视频的政策,必须是muted

  

您可以查看here

所以只需添加静音

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

答案 4 :(得分:11)

我刚刚收到与我的视频相同的问题

<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”,视频通常会启动

答案 5 :(得分:8)

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

       'babu.balakrishnan',  'Slim', '20'
       'prasenjit.ghosh',    'Slim', '2'
       'shamim.akhtar',      'Slim', '2'
       'babu.balakrishnan',  'Slim', '1'
                         '', 'Feature', ' '

答案 6 :(得分:8)

Chrome不允许自动播放带有声音的视频,因此请确保将muted属性添加到video标签中,

<video width="320" height="240"  autoplay muted>
  <source src="video.mp4" type="video/mp4">
</video>

答案 7 :(得分:3)

在野生动物园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/

答案 8 :(得分:2)

其他答案都不适合我。 我的解决方法是触发视频本身的点击; hacky(因为需要超时)但它运行正常:

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

答案 9 :(得分:2)

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

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

答案 10 :(得分:2)

  

尝试一下:

  <video width="320" height="240"  autoplay muted>
            <source src="video.mp4" type="video/mp4">
  </video>

答案 11 :(得分:1)

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

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

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

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

答案 12 :(得分:1)

我在 iPhone 上的 Safari 上播放视频时遇到问题。在 playsinline 标签中添加 video 属性可以解决这个问题,并且有效!

<video autoplay muted loop playsinline class="someClass">
  <source src="source.mp4" type="video/mp4">
</video>

您在 OSX 上的 Safari 上也会遇到这个问题,以防您对这个属性 playsinline 感到困惑,here 是解释。

<块引用>

移动浏览器,playsinline 将在视频所在位置播放,而不是默认情况下,即在播放时全屏打开。

对于 OSX 上的 Safari,由于默认网站 Auto-Play 选项为 Stop Media with Sound,因此该策略也会引入权限问题。

这就是我们需要属性 muted 的原因。

Safari Preferences

答案 13 :(得分:1)

  • 请在 muted 字之前使用 autoplay 关键字,这里是 2018 年 4 月的一些隐私变更。
  • 您可以阅读政策here

答案 14 :(得分:1)

角度 10:

<video [muted]="true" [autoplay]="true" [loop]="true">
    <source src="/assets/video.mp4" type="video/mp4"/>
</video>

答案 15 :(得分:1)

尝试换入 autoPlay代表autoplay

有时似乎区分大小写。非常奇怪,因为它对我来说像autoplay一样有效,但前提是我包括controls

答案 16 :(得分:1)

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

这终于对我有用:

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

答案 17 :(得分:1)

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

仅此解决方案对我有帮助,<video autoplay muted ...>...</video>无效...

答案 18 :(得分:0)

Google更新了自动播放政策。自动播放仅在静音模式下起作用。 检查链接https://developers.google.com/web/updates/2017/09/autoplay-policy-changes

答案 19 :(得分:0)

我解决了同样的问题,

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

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

答案 20 :(得分:0)

我通过使其静音来自动播放。 我认为Google规则除非将其静音,否则不会允许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>

答案 21 :(得分:0)

试试这个,它既简单又简短,它适用于我的代码,而我有全屏视频,在其他元素后面我只是使用 z-index -1;

    <video autoplay loop id="myVideo">

答案 22 :(得分: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();
}

答案 23 :(得分:0)

在 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>
);
}

记住

  • 视频在同一目录中,导入。
  • 要自动播放背景中的视频,请使用 autoPlay静音 道具。

答案 24 :(得分:0)

我有一个案例,它与不同文件类型的顺序有关。尝试改变它,看看是否有帮助。

答案 25 :(得分:0)

试试这个:

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

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