ビデオの自動再生が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 2013

一部のページではまったく機能しません
Adam Bubela 2013

同じ問題に直面し、1週間前は問題なく動作しましたが、何も変更せずに動作しなくなりました。多分それはブラウザの更新であり、javascriptを介してすべてのビデオタグを手動で再生しなければならないのは非常に面倒です
bingeScripter

Chromeで動作しません。
ボブ・ビルダー

回答:


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(); });
マーティン


5
ユーザーインタラクションなしではこれは機能しませんAFAIK
webkit '17


93

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

このあたりとしてポストdevelopers.google.com、クロム53から、自動再生オプションは、ブラウザによって尊敬されている映像がミュートされている場合

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

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

ビデオのためのミュート自動再生がバージョン53の再生のようChrome for Androidの両方でサポートされていた場合、それは視野に入ってくる一度video要素のために自動的に起動されます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ですでにサポートされています。これらは、自動再生をブロックしません。

3
Safari 11でこの問題が発生しました。バックグラウンドビデオ(オーディオなし)が自動的に再生されません。追加mutedautoplayトリックはなかったです。ありがとう!
dmbaughman 2017年

1
では、なぜサウンドがオンの自動再生がYouTubeで機能するのでしょうか。それはサイトの創設以来そのように機能しています。
ザビエル

32

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


2
.wrap()では機能しないことを確認してください。ただし、私の知る限り、コードが機能するには.get(0)が必要です。$( "#vid")。get(0).play();
mattsoave 2017年

3
@mattsoave .get(0)または単に$('#vid')[0].play()
pmrotule

2017年10月、タグの属性にかかわらず動画が自動再生されないのは、Safariの問題です。mattsoave / pmrotuleで提案されている[0] .play()を使用して問題を解決しました。
Don Cullen、2017年

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

クロームで、ミュートされた無効化音を追加した場合。私はこれを望んでいません
lisarko8077

17

Chromeでは、音声をオンにした状態で動画を自動再生することはできないため、次のようmutedvideoタグに属性を追加してください。

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

3
それは新しいものを追加しません。受け入れ答えはすでにこれを言及しています。また、2番目の回答についても詳しく説明します。
サミュエルフィリップ

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>

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

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


自動再生が存在する場合、プリロード属性はブラウザによって無視されます。
SedatBaşar19年

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)に0.5秒のタイマーを設定しました。ready()
Orboniaから2017

3

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

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

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

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



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ビデオの自動再生を妨げているためです。デフォルトでは、自動再生は許可されません。クロムフラグ設定を使用してこの設定を変更できます。これは通常のケースでは不可能なので、別の解決策を見つけました。これは完璧に機能しています...(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

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

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

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

1

サファリIphone では、バタリーが低く、iPhoneが低電力モードの場合、自動再生、ループ、ミュート、playsinlineが動画のhtmlタグに設定されていても、自動再生されません

歩き回ることは、ビデオ再生をトリガーするユーザージェスチャーイベントを作成することであることがわかりました。

document.body.addEventListener("touchstart", function () {
    var allVideos = document.querySelectorAll('video');
    for (var i = 0; i < allVideos.length; i++) {
        allVideos[i].play();
    }
},{ once: true });

ユーザージェスチャーとiOSのビデオポリシーの詳細については、webkitサイトを参照してください。

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


0

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


0

私はすべての目に見えるビデオを再生することから始めましたが、古い電話はうまく機能していませんでした。そこで、現在、ウィンドウの中央に最も近い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

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

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

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


0

交換してみてください autoPlayについてautoplay

大文字と小文字が区別される場合があります。それはautoplay私と同じように機能したため、非常に奇妙ですが、私が含めた場合のみcontrols

弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.