Ich habe eine Website erstellt, auf der, wenn der Benutzer klickt, ein Ton abgespielt wird. Um zu verhindern, dass sich der Ton überschneidet, musste ich den folgenden Code hinzufügen:
n.pause();
n.currentTime = 0;
n.play();
Dies führt jedoch zu dem Fehler:
The play() request was interrupted by a call to pause()
Wird jedes Mal angezeigt, wenn das Soundereignis direkt nach einem anderen Trigger ausgelöst wird. Die Sounds spielen immer noch gut, aber ich möchte verhindern, dass diese Fehlermeldung ständig auftaucht. Irgendwelche Ideen?
javascript
html
google-chrome
audio
Owen M.
quelle
quelle
onCanPlay()
. Alle diese Antworten sind schmutzige Hacks.n.play()
dann versuchtn.pause()
. Zu diesem Zweck beschreibt dieser Artikel zu Web Fundamentals die Lösung. tl; dr:n.play().then(() => { n.pause()})
Antworten:
Ich bin auch kürzlich auf dieses Problem gestoßen - dies könnte eine Rennbedingung zwischen
play()
und seinpause()
. Es sieht so aus, als ob es einen Verweis auf dieses Problem gibt oder etwas, das hier verwandt ist .Wie @Patrick hervorhebt ,
pause
gibt es kein Versprechen (oder irgendetwas) zurück, sodass die oben genannte Lösung nicht funktioniert. Während MDN keine Dokumente enthältpause()
, heißt es im WC3-Entwurf für Medienelemente :Man könnte also auch das
paused
Attribut in ihrem Timeout-Rückruf überprüfen .Basierend auf dieser großartigen SO-Antwort können Sie auf folgende Weise überprüfen, ob das Video wirklich abgespielt wird (oder nicht), sodass Sie eine Wiedergabe () ohne Fehler sicher auslösen können.
Andernfalls sollte die Antwort von @Patrick funktionieren.
quelle
Nach stundenlangem Suchen und Arbeiten fand ich die perfekte Lösung .
Danach können Sie die Wiedergabe / Pause so schnell wie möglich umschalten, es funktioniert ordnungsgemäß .
quelle
Ich bin auf dieses Problem gestoßen und habe einen Fall, in dem ich pause () und dann play () drücken musste, aber bei Verwendung von pause (). Then () werde ich undefiniert.
Ich stellte fest, dass das Problem behoben wurde, wenn ich 150 ms nach der Pause mit dem Spielen begann. (Hoffentlich behebt Google bald)
quelle
Ich habe gerade einen Artikel zu diesem genauen Problem unter https://developers.google.com/web/updates/2017/06/play-request-was-interrupted veröffentlicht , der Ihnen genau sagt, was passiert und wie Sie es beheben können .
quelle
Versuch es
quelle
Diese Lösung hat mir geholfen:
quelle
Je nachdem, wie komplex Ihre Lösung sein soll, kann dies hilfreich sein:
Dies ist ein bisschen übertrieben, hilft aber bei der Behandlung eines Versprechens in einzigartigen Szenarien.
quelle
Die hier vorgeschlagenen Lösungen funktionierten entweder nicht für mich oder waren zu groß, also suchte ich nach etwas anderem und fand die von @dighan vorgeschlagene Lösung auf bountysource.com/issues/
Hier ist der Code, der mein Problem gelöst hat:
Es wird immer noch ein Fehler in die Konsole geworfen, aber zumindest wird das Video abgespielt :)
quelle
Vielleicht eine bessere Lösung dafür, wie ich herausgefunden habe. Spec sagt, wie aus @JohnnyCoder zitiert:
-> Laden
gibt den Bereitschaftszustand des Mediums an HAVE_ENOUGH_DATA = 4
Laden Sie das Video grundsätzlich nur, wenn es noch nicht geladen ist. Der erwähnte Fehler ist bei mir aufgetreten, weil das Video nicht geladen wurde. Vielleicht besser als eine Auszeit.
quelle
Alle Fehler entfernt: (Typoskript)
quelle
Beim Live-Streaming stand ich vor dem gleichen Problem. und mein Fix ist das. Stellen Sie im HTML-Video-TAG sicher , dass Sie "Autoplay" entfernen und den folgenden Code zum Abspielen verwenden.
quelle
Chrome gibt in den neuesten Versionen ein Versprechen zurück. Ansonsten einfach:
quelle
Ich habe das gleiche Problem, schließlich löse ich durch:
quelle
Dieser Code wurde für mich repariert!
Geänderter Code von @JohnnyCoder
HTML:
JS:
quelle
Ich habe es mit einem Code unten behoben:
Wenn Sie spielen möchten, verwenden Sie Folgendes:
Ebenso, wenn Sie eine Pause wünschen:
quelle
Hier ist eine andere Lösung, wenn der Grund dafür ist, dass Ihr Video-Download sehr langsam ist und das Video nicht gepuffert hat:
if (videoElement.state.paused) { videoElement.play(); } else if (!isNaN(videoElement.state.duration)) { videoElement.pause(); }
quelle
Es sieht so aus, als ob viele Programmierer auf dieses Problem gestoßen sind. Eine Lösung sollte recht einfach sein. Medienelement Rückkehr
Promise
von Aktionen sosollte den Trick machen
quelle
hier ist eine lösung von googler blog:
quelle
Alle neuen Browser-Support-Videos werden automatisch abgespielt und nur stummgeschaltet. Bitte geben Sie so etwas an
Die URL des Videos sollte mit dem SSL-Status übereinstimmen, wenn Ihre Site mit https ausgeführt wird. Die Video-URL sollte auch in https und für HTTP gleich sein
quelle
Die sauberste und einfachste Lösung:
quelle
Grund eins - Pause anrufen, ohne auf das Spielversprechen zu warten
Zu viele Antworten auf dieses Szenario, daher beziehe ich mich auf das beste Dokument für dieses Problem:
https://developers.google.com/web/updates/2017/06/play-request-was-interrupted
Grund zwei - Aufruf des Spiels, wenn die Registerkarte nicht fokussiert ist
In diesem Fall könnte der Browser das
play
durch Aufrufen unterbrechenpause
wenn die Registerkarte nicht fokussiert ist. um Ressourcen für die aktive Registerkarte zu sparen.Sie können also einfach warten, bis der Tab fokussiert ist, bevor Sie play aufrufen:
quelle
Ich bin auf dasselbe Problem gestoßen und habe es behoben, indem ich das
autoplay
Attribut dynamisch hinzugefügt habe , anstatt es zu verwendenplay()
. Auf diese Weise stellte der Browser fest, dass er spielen konnte, ohne in den Rennzustand zu geraten.quelle
Beim Versuch, ein Video mit automatischer Wiedergabe durch Aufrufen zu einer Schleife zu bringen,
play()
wenn es beendet wird, hat die Timeout-Problemumgehung bei mir nicht funktioniert (wie lange das Timeout auch ist).Aber ich habe festgestellt, dass durch das Klonen / Ersetzen des Videos durch jQuery am Ende eine ordnungsgemäße Schleife ausgeführt wird.
Beispielsweise:
und
Ich verwende Chrome 54.0.2840.59 (64-Bit) / OS X 10.11.6
quelle
Ich denke, sie haben das HTML5-Video aktualisiert und einige Codecs veraltet. Es hat bei mir nach dem Entfernen der Codecs funktioniert.
Im folgenden Beispiel:
quelle
Wenn Sie einen Fehler mit sehen
Uncaught (in promise)
Dies bedeutet nur, dass Sie das Versprechen mit einem behandeln müssen..catch()
In diesem Fall wird.play()
ein Versprechen zurückgegeben. Sie können entscheiden, ob Sie eine Nachricht protokollieren, Code ausführen oder nichts tun möchten. Solange Sie.catch()
den Fehler haben, wird er behoben.quelle
Ich habe einen Trick benutzt, um diesem Problem entgegenzuwirken. Definieren Sie eine globale Variable var audio.
und in der Funktionsprüfung
und in der Stoppfunktion
also der nächste anruf von
audio.play
ist Audio ab '0' currentTime bereitich benutzte
aber es hat nicht funktioniert. Vielen Dank.
quelle