私のサイトにはこれらの動画があり、その属性は以下のとおりです。
<video width="100%" poster="poster_url.png" autoplay loop muted playsinline>
<source src="video_url.mp4" type="video/mp4">
</video>
Safari 11をインストールするまで、すべて正常に機能しました。このバージョンではポスター画像が表示され、オーディオトラックがなくてもビデオは自動再生されません。私の site を見てください。
Safariの自分のラップトップで自動再生ビデオが機能しているのを見ました 他のサイトで (ミュートされたプロパティがなくても)。
どんな助けも大歓迎です!
うん、Safariはミュートされたビデオ(音さえない)もブロックしているようです...
私は回避策を見つけましたが、それはきれいではなく、私はそれを誇りに思っていません:
var ua = navigator.userAgent.toLowerCase();
var is_safari = (ua.indexOf("safari/") > -1 && ua.indexOf("chrome") < 0);
if(is_safari) {
var video = document.getElementById('#video-element-id');
setTimeout(function() {
video.play();
}, 50);
}
タイムアウトなしでこれを試しましたが、SafariはPromise拒否をスローしてこれを拒否しています。理由がわかりません...
ウェブサイトのバックグラウンドで再生される短いmp4でもこの問題に遭遇しました。ビデオタグをcontrols="true"
およびplaysinline
で修飾することにより、JSを必要とせずにiOS Safari 11で動作するソリューションを得ることができました。
例:
<video autoplay loop playsinline muted controls="true" src="~/background.mp4" type="video/mp4"></video>
注: Safariは.webmをサポートしていないので、私のようにならないでください。
私が見つけた最も信頼できる方法は、以下を保証することです。
これは次のようになります。
<style>
video {
display: none;
}
video.active {
display: block;
}
</style>
<button id="button">Show video</button>
<video id="video" muted playsinline></video>
<script>
var button = document.getElementById('button');
var video = document.getElementById('video');
button.addEventListener('click', function() {
video.className = 'active';
video.src = url;
video.play();
});
</script>
<source>を使用する代わりに、<video>内にsrc
属性を配置します
<video src="video_url.mp4" width="100%" poster="poster_url.png" autoplay loop muted playsinline></video>
<source>を使用すると、ページの読み込み時に要素が表示されている場合にのみ機能します(safari 11.0でテスト済み)
macOSの自動再生ポリシーの変更 のリンク。
同様の問題に遭遇し、canplaythroughイベント(またはcanplayイベント)で解決しました。これにより、AbayobのソリューションでのsetTimeoutの必要性が解決される場合があります。
const video = document.getElementById('#video-element-id');
video.oncanplaythrough = function() {
video.play();
}