J'ai créé un site Web où si l'utilisateur clique, il joue un son. Pour éviter que le son ne se chevauche, j'ai dû ajouter le code:
n.pause();
n.currentTime = 0;
n.play();
Mais cela provoque l'erreur: se
The play() request was interrupted by a call to pause()
produire chaque fois que l'événement sonore est déclenché juste après un autre déclencheur. Les sons jouent toujours bien, mais je veux éviter que ce message d'erreur n'apparaisse constamment. Des idées?
javascript
html
google-chrome
audio
Owen M
la source
la source
onCanPlay()
. Toutes ces réponses sont de sales hacks.n.play()
alorsn.pause()
. Pour cela, cet article Web Fundamentals décrit la solution. tl; dr:n.play().then(() => { n.pause()})
Réponses:
J'ai également rencontré ce problème récemment - cela pourrait être une condition de concurrence entre
play()
etpause()
. Il semble qu'il y ait une référence à ce problème, ou à quelque chose lié ici .Comme le souligne @Patrick ,
pause
ne renvoie pas de promesse (ou quoi que ce soit), donc la solution ci-dessus ne fonctionnera pas. Bien que MDN n'ait pas de documentation surpause()
, dans le brouillon WC3 pour Media Elements , il est dit:Ainsi, on peut également vérifier l'
paused
attribut dans leur rappel de délai d'expiration.Sur la base de cette excellente réponse SO , voici un moyen de vérifier si la vidéo est (ou non) réellement lue, afin de pouvoir déclencher une lecture () en toute sécurité sans l'erreur.
Sinon, la réponse de @Patrick devrait fonctionner.
la source
Après des heures de recherche et de travail, j'ai trouvé la solution parfaite .
Après cela, vous pouvez basculer lecture / pause aussi vite que possible, cela fonctionnera correctement .
la source
J'ai rencontré ce problème, et j'ai un cas où je devais appuyer sur pause () puis play () mais lorsque j'utilise pause (). Then () je deviens indéfini.
J'ai constaté que si je commençais à jouer 150 ms après une pause, le problème était résolu. (Espérons que Google corrige bientôt)
la source
Je viens de publier un article sur ce problème précis sur https://developers.google.com/web/updates/2017/06/play-request-was-interrupted qui vous indique exactement ce qui se passe et comment y remédier .
la source
l'essayer
la source
Cette solution m'a aidé:
la source
En fonction de la complexité de votre solution, cela peut être utile:
C'est un peu exagéré, mais cela aide lors de la gestion d'une promesse dans des scénarios uniques.
la source
Les solutions proposées ici ne fonctionnaient pas pour moi ou étaient trop importantes, alors je cherchais autre chose et j'ai trouvé la solution proposée par @dighan sur bountysource.com/issues/
Voici donc le code qui a résolu mon problème:
Il jette toujours une erreur dans la console, mais au moins la vidéo est en cours de lecture :)
la source
Peut-être une meilleure solution pour cela comme je l'ai compris. Spec dit comme cité de @JohnnyCoder:
-> le chargement
indique l'état de disponibilité du média HAVE_ENOUGH_DATA = 4
En gros, ne chargez la vidéo que si elle n'est pas déjà chargée. Une erreur mentionnée s'est produite pour moi, car la vidéo n'a pas été chargée. Peut-être mieux que d'utiliser un timeout.
la source
supprimé toutes les erreurs: (dactylographié)
la source
Avec la diffusion en direct, j'étais confronté au même problème. et ma solution est la suivante. À partir du TAG vidéo html, assurez-vous de supprimer "autoplay" et utilisez ce code ci-dessous pour jouer.
la source
Chrome renvoie une promesse dans les dernières versions. Sinon, simplement:
la source
J'ai le même problème, enfin je résous par:
la source
Ce morceau de code corrigé pour moi!
Code modifié de @JohnnyCoder
HTML:
JS:
la source
Je l'ai corrigé avec un peu de code ci-dessous:
Lorsque vous voulez jouer, utilisez ce qui suit:
De même, lorsque vous souhaitez mettre en pause:
la source
Voici une autre solution si la raison en est que le téléchargement de votre vidéo est très lent et que la vidéo n'a pas été mise en mémoire tampon:
if (videoElement.state.paused) { videoElement.play(); } else if (!isNaN(videoElement.state.duration)) { videoElement.pause(); }
la source
Il semble que de nombreux programmeurs aient rencontré ce problème. une solution doit être assez simple. l'élément multimédia revient
Promise
des actionsdevrait faire l'affaire
la source
voici une solution du blog googler:
la source
Toutes les nouvelles vidéos de support de navigateur doivent être lues automatiquement avec le son uniquement, veuillez donc mettre quelque chose comme ça
L'URL de la vidéo doit correspondre à l'état SSL si votre site fonctionne avec https, l'URL de la vidéo doit également être en https et de même pour HTTP
la source
La solution la plus propre et la plus simple :
la source
Raison n ° 1 - Appeler pause sans attendre que la promesse de lecture se résout
trop de réponses pour ce scénario, je vais donc me référer au meilleur document pour ce problème:
https://developers.google.com/web/updates/2017/06/play-request-was-interrupted
Deuxième raison - appeler la lecture lorsque l'onglet n'est pas focalisé
Dans ce cas, le navigateur peut interrompre le
play
en appelantpause
lorsque l'onglet n'est pas actif. afin d'économiser des ressources pour l'onglet actif.Vous pouvez donc simplement attendre que l'onglet se concentre avant d'appeler play:
la source
J'ai rencontré le même problème et je l'ai résolu en ajoutant dynamiquement l'
autoplay
attribut plutôt qu'en utilisantplay()
. De cette façon, le navigateur a compris pour jouer sans se heurter à la condition de concurrence.la source
En essayant d'obtenir une vidéo en lecture automatique en boucle en l'appelant
play()
à la fin, la solution de contournement du délai d'attente n'a pas fonctionné pour moi (quelle que soit la durée du délai).Mais j'ai découvert qu'en clonant / remplaçant la vidéo par jQuery à la fin, elle bouclerait correctement.
Par exemple:
et
J'utilise Chrome 54.0.2840.59 (64 bits) / OS X 10.11.6
la source
Je pense qu'ils ont mis à jour la vidéo html5 et ont désapprouvé certains codecs. Cela a fonctionné pour moi après avoir supprimé les codecs.
Dans l'exemple ci-dessous:
la source
Lorsque vous voyez une erreur avec
Uncaught (in promise)
Ceci signifie simplement que vous devez gérer la promesse avec un.catch()
Dans ce cas,.play()
renvoie une promesse. Vous pouvez décider si vous souhaitez enregistrer un message, exécuter du code ou ne rien faire, mais tant que vous avez,.catch()
l'erreur disparaîtra.la source
J'ai utilisé une astuce pour contrer ce problème. Définissez une variable globale var audio;
et dans le contrôle de fonctionnement
et dans la fonction d'arrêt
donc le prochain appel de
audio.play
, l'audio sera prêt à partir de '0' currentTimej'ai utilisé
mais cela n'a pas fonctionné. Merci.
la source