web-dev-qa-db-ja.com

SafariおよびChromeデスクトップブラウザでビデオの自動再生が機能しない

ここにビデオが埋め込まれている理由を理解しようとしてかなりの時間を費やしました。

<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が疑われます。

86
Adam Bubela

私が得た最善の修正は、</video>の直後にこのコードを追加することでした

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

...きれいではありませんが、何らかの形で動作します。

UPDATE最近、多くのブラウザは音声をオフにした状態でのみビデオを自動再生できるため、ビデオタグにもmuted属性を追加する必要があります。

<video autoplay muted>
...
</video>
146
Adam Bubela

他の回答で示唆されているようにjQuery play()またはDOM操作を使用した後、Chrome(バージョン56.0)のAndroidでまだ機能していません(ビデオは自動再生されませんでした)。

このように post indevelopers.google.comから、Chrome 53から、自動再生オプションはブラウザによって尊重され、動画がミュートされている場合

したがって、ビデオタグでautoplay muted属性を使用すると、バージョン53以降のChromeブラウザーでビデオを自動再生できます。

上記のリンクからの抜粋:

ビデオのミュート自動再生は、バージョン53のChromeの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 BrowserによってAndroidで既にサポートされています。これらは、いかなる種類の自動再生もブロックしません。
79
Ram

SafariとデスクトップのChromeは、ビデオタグの周りのDOM操作を好まないことがあります。 autoplay属性が設定されている場合、再生順序は発生し​​ませんeven最初のページの読み込み後にビデオタグの周囲のDOMが変更されたときにcanplaythroughイベントが発生した場合。基本的に、ビデオタグの周りの.wrap()jQueryを削除し、その後期待どおりに自動再生するまで、同じ問題がありました。

31
Arnaud Leyder

私にとっての問題は、muted属性をvideoタグ内に追加する必要があるということでした。つまり:

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

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

ビデオで同じ問題が発生しました

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

検索後、私は解決策を見つけました:

「プリロード」属性を「true」に設定すると、ビデオは正常に開始します

11
Thomas Lohner

ページの下部に以下のコードを追加するとうまくいきました。なぜそれが機能するのか分かりません:(

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

これを試して:

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

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

このソリューションだけが私を助けてくれました、<video autoplay muted ...>...</video>は機能しませんでした...

2
Ant0ha

これは、現在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
Rijosh K

他の答えはどれも私にとってはうまくいきませんでした。私の回避策は、ビデオ自体をクリックすることでした。 hacky(タイムアウトが必要なため)

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

最近、埋め込みビデオに関する同様の問題に対処し、自動再生とミュートの属性では実装に不十分であることがわかりました。

コードに3番目の「playsinline」属性を追加し、iOSユーザーの問題を修正しました。

この修正は、インラインで再生されるビデオに固有のものです。 https://webkit.org/blog/6784/new-video-policies-for-ios/ から:

IPhoneでは、要素がインラインで再生できるようになり、再生の開始時に自動的にフルスクリーンモードになりません。 playsinline属性のない要素は、引き続きiPhoneで再生するためにフルスクリーンモードを必要とします。ピンチジェスチャでフルスクリーンを終了すると、playsinlineのない要素は引き続きインラインで再生されます。

1
mingala

上記のすべてのソリューションを試して2時間を費やしました。

これは最終的に私のために働いたものです:

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

私は同じ問題を解決しました、

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

ページが表示された後、ビデオを起動する必要があります。

これを試して:

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

これは私が通常行う方法です。ループ、コントロール、および自動再生は、ブール属性である値を必要としません。

0
Jared.DAGI

さまざまなファイルタイプの順序に関係がある場合がありました。変更して、それが役立つかどうかを確認してください。

0
MoritzGiessmann

私は目に見えるすべてのビデオを再生することから始めましたが、古い携帯電話はうまく機能していませんでした。そのため、今はウィンドウの中央に最も近い1つのビデオを再生し、残りを一時停止します。バニラ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
ubershmekel