199

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

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

4

31 回答 31

416

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

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

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

更新 最近很多浏览器只能自动播放没有声音的视频,所以你也需要给muted视频标签添加属性

<video autoplay muted>
...
</video>
于 2013-08-01T12:53:37.433 回答
111

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

根据developers.google.com上的这篇文章,从Chrome 53 开始,如果视频静音,浏览器会尊重自动播放选项。

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

摘自上述链接:

自 53 版起,Chrome for Android 支持视频的静音自动播放。如果视频元素进入视野,则播放将自动开始,如果两者autoplaymuted设置了 [...]

<video autoplay muted>
    <source src="video.webm" type="video/webm" />
    <source src="video.mp4" type="video/mp4" />
</video>
  • iOS 10 及更高版本上的 Safari 支持静音自动播放。
  • Firefox 和 UC 浏览器已经在 Android 上支持自动播放,无论是否静音:它们不会阻止任何类型的自动播放。
于 2017-02-23T11:44:13.833 回答
54

谷歌刚刚改变了他们对自动播放视频的政策,它必须是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>
于 2018-05-18T00:40:34.727 回答
32

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

于 2014-11-13T11:14:29.313 回答
30

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

<video width="1920" height="1980" src="video/Night.mp4"
type="video/mp4" frameborder="0" allowfullscreen autoplay loop
muted></video>`
于 2017-10-27T21:25:48.480 回答
23

Chrome 不允许在有声音的情况下自动播放视频,因此请确保像这样向标签添加muted属性video

<video width="320" height="240"  autoplay muted>
  <source src="video.mp4" type="video/mp4">
</video>
于 2019-09-25T07:54:37.163 回答
17
var video = document.querySelector('video');
video.muted = true;
video.play()

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

于 2018-09-20T08:53:04.117 回答
14

我的视频现在也遇到了同样的问题

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

于 2014-07-10T09:11:09.200 回答
10

尝试这个:

  <video width="320" height="240"  autoplay muted>
            <source src="video.mp4" type="video/mp4">
  </video>
于 2019-05-02T10:26:40.093 回答
8

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

 setTimeout(function(){
     document.getElementById('vid').play();
 },1000);
于 2016-11-24T05:47:11.163 回答
7

muted属性结合使用时它对我有用

于 2021-09-09T14:04:39.377 回答
6

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

于 2020-06-09T09:16:10.910 回答
5
  • 请在单词muted前使用关键字autoplay,此处在 2018 年 4 月进行了一些隐私更改。
  • 您可以在此处阅读政策
于 2021-04-23T13:13:08.457 回答
5

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

于 2019-12-05T05:49:25.433 回答
5

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

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

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

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

于 2018-11-28T22:45:32.977 回答
5

换个试试 autoPlayautoplay

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

于 2020-06-11T00:59:49.387 回答
4

我让它静音来自动播放。我认为谷歌规则不会让 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>
于 2020-11-27T01:00:59.133 回答
4

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

<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

Safari 偏好设置

于 2021-05-17T13:49:21.333 回答
3

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

function startVideoIfNotStarted () {
    $(".id_of_video_tag").ready(function () {
        window.setTimeout(function(){
            videojs("id_of_video_tag").play()
        }, 1000);
    });
}
$(startVideoIfNotStarted);
于 2014-11-24T15:14:21.640 回答
3

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

这最终对我有用:

var vid = document.getElementById("myVideo");
vid.muted = true;
于 2019-05-10T00:12:05.380 回答
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>

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

于 2013-08-01T13:58:55.610 回答
2

这是因为现在 chrome 正在阻止 html5 视频中的自动播放,所以默认情况下它们不允许自动播放。因此我们可以使用 chrome flag 设置更改此设置。这在正常情况下是不可能的,所以我找到了另一种解决方案。这是完美的工作......(添加 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();  
于 2018-05-24T05:44:28.567 回答
2

角 10:

<video [muted]="true" [autoplay]="true" [loop]="true">
    <source src="/assets/video.mp4" type="video/mp4"/>
</video>
于 2021-01-09T19:50:18.773 回答
1
<video onload='this.play()' src='the source' autoplay controls></video>

这对我有用。

于 2021-10-10T12:23:51.517 回答
0

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

于 2014-08-22T09:44:06.603 回答
0

对于角度,您必须将其静音并按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() 
​ } 
于 2021-11-30T09:24:01.323 回答
0

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

    <video autoplay loop id="myVideo">
于 2020-12-19T19:39:46.310 回答
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();
}
于 2017-10-28T05:14:24.217 回答
0

我解决了同样的问题,

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

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

于 2018-01-10T09:42:44.243 回答
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>
);
}

记住

  • 视频在同一目录中,要导入它。
  • 要自动播放,背景中的视频,使用自动播放静音道具
于 2021-02-19T07:11:05.103 回答
0

您应该始终查看 play 函数返回的 Promise 以查看它是否被拒绝

答案,我写过类似的问题

于 2021-12-01T08:29:15.267 回答