Je reçois le message d'erreur ..
Non pris (promis) DOMException: play () a échoué car l'utilisateur n'a pas interagi avec le document auparavant.
..quand essayer de lire une vidéo sur le bureau en utilisant Chrome version 66.
J'ai trouvé une annonce dont la lecture a commencé automatiquement sur un site Web, mais en utilisant le code HTML suivant:
<video
title="Advertisement"
webkit-playsinline="true"
playsinline="true"
style="background-color: rgb(0, 0, 0); position: absolute; width: 640px; height: 360px;"
src="http://ds.serving-sys.com/BurstingRes/Site-2500/Type-16/1ff26f6a-aa27-4b30-a264-df2173c79623.mp4"
autoplay=""></video>
Par conséquent, contourner le bloqueur de lecture automatique de Chrome v66 est-il vraiment aussi simple que d'ajouter les attributs webkit-playsinline="true"
, playsinline="true"
et autoplay=""
à l'élément <video>
? Y at-il des conséquences négatives à cela?
Pour que l'auto-lecture sur les balises html 5 fonctionne après la mise à jour de Chrome 66, il vous suffit d'ajouter la propriété muted
à la balise video.
Donc, votre vidéo HTML actuelle
<video
title="Advertisement"
webkit-playsinline="true"
playsinline="true"
style="background-color: rgb(0, 0, 0); position: absolute; width: 640px; height: 360px;"
src="http://ds.serving-sys.com/BurstingRes/Site-2500/Type-16/1ff26f6a-aa27-4b30-a264-df2173c79623.mp4"
autoplay=""></video>
Juste besoin de muted="muted"
<video
title="Advertisement"
style="background-color: rgb(0, 0, 0); position: absolute; width: 640px; height: 360px;"
src="http://ds.serving-sys.com/BurstingRes/Site-2500/Type-16/1ff26f6a-aa27-4b30-a264-df2173c79623.mp4"
autoplay="true"
muted="muted"></video>
Je crois que la mise à jour de chrome 66 tente d’empêcher les onglets de créer un bruit aléatoire sur les onglets des utilisateurs. C'est pourquoi la propriété muette fait à nouveau fonctionner la lecture automatique.
chrome://flags/#autoplay-policy
La meilleure solution que j'ai trouvée est de mettre la vidéo en sourdine
HTML
<video loop muted autoplay id="videomain">
<source src="videoname.mp4" type="video/mp4">
</video>
Répondre à la question posée ...
Non, il ne suffit pas d'avoir ces attributs, pour pouvoir lire automatiquement un média avec de l'audio, il est nécessaire de faire enregistrer un geste de l'utilisateur sur votre document.
Mais cette limitation est très faible: si vous avez reçu ce geste de l'utilisateur sur le document parent et que votre vidéo a été chargée à partir d'un iframe, vous pouvez alors la lire ...
Alors prenons par exemple ce violon , qui est seulement
<video src="myvidwithsound.webm" autoplay=""></video>
Au premier chargement, et si vous ne cliquez nulle part, il ne fonctionnera pas, car aucun événement n'a encore été enregistré.
Mais une fois que vous avez cliqué sur le bouton "Exécuter", le document parent (jsfiddle.net) a reçu un geste de l'utilisateur. La vidéo est alors lue, même s'il est techniquement chargé dans un autre document.
Mais l'extrait de code suivant, puisqu'il vous oblige à cliquer sur le bouton Exécuter l'extrait de code, sera automatiquement lu.
<video src="https://upload.wikimedia.org/wikipedia/commons/transcoded/2/22/Volcano_Lava_Sample.webm/Volcano_Lava_Sample.webm.360p.webm" autoplay=""></video>
Cela signifie que votre annonce a probablement pu être lue, car vous avez fourni un geste de l'utilisateur à la page principale.
Notez maintenant que Safari et Mobile Chrome ont des règles plus strictes que cela et vous obligeront à déclencher au moins une fois la méthode play()
par programme sur l'élément <video>
ou <audio>
à partir du gestionnaire d'événements utilisateur lui-même.
btn.onclick = e => {
// mark our MediaElement as user-approved
vid.play().then(()=>vid.pause());
// now we can do whatever we want at any time with this MediaElement
setTimeout(()=> vid.play(), 3000);
};
<button id="btn">play in 3s</button>
<video
src="https://upload.wikimedia.org/wikipedia/commons/transcoded/2/22/Volcano_Lava_Sample.webm/Volcano_Lava_Sample.webm.360p.webm" id="vid"></video>
Et si vous n'avez pas besoin de l'audio, ne la connectez pas simplement à votre média. Une vidéo contenant uniquement une piste vidéo est également autorisée à lire automatiquement, ce qui réduira l'utilisation de la bande passante par l'utilisateur.
Essayez d’utiliser mousemove event lisentner
var audio = document.createElement("AUDIO")
document.body.appendChild(audio);
audio.src = "./audio/rain.m4a"
document.body.addEventListener("mousemove", function () {
audio.play()
})
Pour moi (dans le projet Angular), ce code a aidé:
En HTML, vous devriez ajouter autoplay muted
En JS/TS
playVideo() {
const media = this.videoplayer.nativeElement;
media.muted = true; // without this line it's not working although I have "muted" in HTML
media.play();
}
Si cette technique ne fonctionne plus, il existe une autre option. Vous pouvez inclure un son court et très silencieux (-60db) et le lire dans le gestionnaire de clic du bouton caché. Après cela, tous les autres fichiers audio/vidéo seront autorisés à jouer sans interaction directe de l'utilisateur. Vous pouvez prendre un son silencieux depuis http://adventure.land/sounds/loops/empty_loop_for_js_performance.wav et le couper en une demi-seconde (ou moins).
Il existe une solution très simple: ajoutez simplement un BOUTON à votre page, donnez-lui un style invisible, puis appelez la méthode button.click()
avant la play()
.
Fonctionne comme un charme dans la version 70.0.3538.67 de Chromium (version officielle) (64 bits)
var btn = document.getElementById('btn');
document.addEventListener(btn,myPlay,false);
btn.click();
function myPlay()
{
document.getElementById('movie').play();
}
<video
title="Advertisement" id="movie"
style="background-color: rgb(0, 0, 0); position: absolute; width: 640px; height: 360px;"
src="https://upload.wikimedia.org/wikipedia/commons/transcoded/2/22/Volcano_Lava_Sample.webm/Volcano_Lava_Sample.webm.360p.webm"
></video>
<button type="button" style="z-index:-1;opacity:0;position: absolute;left:-1000px;" id="btn"></button>
Chrome a besoin d'une interaction de l'utilisateur pour que la vidéo soit lue automatiquement ou lue via js (video.play ()). Mais l'interaction peut être de n'importe quel type, à n'importe quel moment. Si vous cliquez simplement au hasard sur la page, la vidéo sera lue automatiquement. J'ai résolu alors, en ajoutant un bouton (uniquement sur les navigateurs Chrome) qui dit "activer la lecture automatique de la vidéo". Le bouton ne fait rien, mais le simple fait de cliquer dessus constitue l'interaction utilisateur requise pour toute vidéo ultérieure.
Vous devriez avoir ajouté l'attribut muted
à l'intérieur de votre videoElement
pour que votre code fonctionne comme prévu. Regardez ci-dessous ..
<video id="IPcamerastream" muted="muted" autoplay src="videoplayback%20(1).mp4" width="960" height="540"></video>
N'oubliez pas d'ajouter un lien vidéo valide en tant que source
J'ai eu quelques problèmes en jouant sur Android Phone . Après quelques essais, j'ai découvert que lorsque Data Saver est activé, la lecture automatique n'est pas possible:
Il n'y a pas d'exécution automatique si Data Saver mode est activé. Si le mode économiseur de données est activé, la lecture automatique est désactivée dans les paramètres de support.
J'ai rencontré une erreur similaire lors de la tentative de lecture d'un fichier audio. Au début, cela fonctionnait, puis il a cessé de fonctionner lorsque j'ai commencé à utiliser la méthode markForCheck
de ChangeDetector dans la même fonction pour déclencher un nouveau rendu lorsqu'une promesse est résolue (un problème de rendu de vue s'est produit.).
Quand j'ai changé la markForCheck
en detectChanges
, cela a recommencé à fonctionner. Je ne peux vraiment pas expliquer ce qui s'est passé, j'ai juste pensé laisser tomber ceci ici, peut-être que cela aiderait quelqu'un.
étendre l’élément DOM, gérer l’erreur et dégrader en douceur
Ci-dessous, j'utilise la fonction prototype pour envelopper la fonction de lecture dans le DOM native, saisir sa promesse, puis passer à un bouton de lecture si le navigateur lève une exception. Cette extension corrige les failles du navigateur et est plug-n-play dans toute page connaissant le ou les éléments cibles.
// JavaScript
// Wrap the native DOM audio element play function and handle any autoplay errors
Audio.prototype.play = (function(play) {
return function () {
var audio = this,
args = arguments,
promise = play.apply(audio, args);
if (promise !== undefined) {
promise.catch(_ => {
// Autoplay was prevented. This is optional, but add a button to start playing.
var el = document.createElement("button");
el.innerHTML = "Play";
el.addEventListener("click", function(){play.apply(audio, args);});
this.parentNode.insertBefore(el, this.nextSibling)
});
}
};
})(Audio.prototype.play);
// Try automatically playing our audio via script. This would normally trigger and error.
document.getElementById('MyAudioElement').play()
<!-- HTML -->
<audio id="MyAudioElement" autoplay>
<source src="https://www.w3schools.com/html/horse.ogg" type="audio/ogg">
<source src="https://www.w3schools.com/html/horse.mp3" type="audio/mpeg">
Your browser does not support the audio element.
</audio>