Zrobiłem stronę internetową, na której jeśli użytkownik kliknie, odtwarza dźwięk. Aby dźwięk nie nakładał się, musiałem dodać kod:
n.pause();
n.currentTime = 0;
n.play();
Ale to powoduje błąd:
The play() request was interrupted by a call to pause()
pojawia się za każdym razem, gdy zdarzenie dźwiękowe jest wyzwalane zaraz po kolejnym wyzwoleniu. Dźwięki nadal działają dobrze, ale chcę zapobiec ciągłemu wyświetlaniu tego komunikatu o błędzie. Jakieś pomysły?
javascript
html
google-chrome
audio
Owen M.
źródło
źródło
onCanPlay()
. Wszystkie te odpowiedzi to brudne hacki.n.play()
wtedyn.pause()
. W tym celu w artykule z podstaw pracy w sieci opisano rozwiązanie. tl; dr:n.play().then(() => { n.pause()})
Odpowiedzi:
Niedawno spotkałem się z tym problemem - może to być stan wyścigu między
play()
apause()
. Wygląda na to, że jest tam odniesienie do tego problemu lub coś związanego z tym tutaj .Jak wskazuje @Patrick ,
pause
nie zwraca obietnicy (ani niczego), więc powyższe rozwiązanie nie zadziała. Chociaż MDN nie ma włączonej dokumentacjipause()
, w wersji roboczej WC3 dla Media Elements jest napisane:Można więc również sprawdzić
paused
atrybut w wywołaniu zwrotnym limitu czasu.W oparciu o tę świetną odpowiedź SO , oto sposób na sprawdzenie, czy wideo jest (lub nie jest) naprawdę odtwarzane, dzięki czemu można bezpiecznie uruchomić play () bez błędu.
W przeciwnym razie, @Patrick „s odpowiedź powinna działać.
źródło
Po godzinach poszukiwań i pracy znalazłem idealne rozwiązanie .
Następnie możesz przełączać odtwarzanie / pauzę tak szybko, jak to możliwe, będzie działać poprawnie .
źródło
Napotkałem ten problem i mam przypadek, w którym musiałem nacisnąć pause (), a następnie grać (), ale podczas używania pause (). Then () jestem niezdefiniowany.
Okazało się, że jeśli zacząłem grać 150 ms po wstrzymaniu, rozwiązało to problem. (Mam nadzieję, że Google wkrótce naprawi)
źródło
Właśnie opublikowałem artykuł o tym dokładnym problemie na https://developers.google.com/web/updates/2017/06/play-request-was-interrupted, który mówi dokładnie, co się dzieje i jak to naprawić .
źródło
Spróbuj
źródło
To rozwiązanie pomogło mi:
źródło
W zależności od tego, jak skomplikowane chcesz rozwiązanie, może to być przydatne:
To trochę przesada, ale pomaga w radzeniu sobie z obietnicą w wyjątkowych sytuacjach.
źródło
Zaproponowane tutaj rozwiązania albo u mnie nie działały, albo gdzie były za duże, więc szukałem czegoś innego i znalazłem rozwiązanie zaproponowane przez @dighan na bountysource.com/issues/
Oto kod, który rozwiązał mój problem:
Nadal wyrzuca błąd do konsoli, ale przynajmniej wideo jest odtwarzane :)
źródło
Może lepsze rozwiązanie tego, jak się domyśliłem. Spec mówi, jak cytowano z @JohnnyCoder:
-> ładowanie
wskazuje stan gotowości nośnika HAVE_ENOUGH_DATA = 4
Zasadniczo ładuj wideo tylko wtedy, gdy nie jest jeszcze załadowane. Wystąpił wspomniany błąd, ponieważ wideo nie zostało załadowane. Może lepiej niż używanie limitu czasu.
źródło
usunięto wszystkie błędy: (maszynopis)
źródło
W przypadku transmisji na żywo miałem ten sam problem. i moja poprawka jest taka. Z tagu wideo html pamiętaj, aby usunąć „autoodtwarzanie” i użyć poniższego kodu do odtwarzania.
źródło
Chrome zwraca obietnicę w najnowszych wersjach. W przeciwnym razie po prostu:
źródło
Mam ten sam problem, ostatecznie rozwiązuję przez:
źródło
Ten fragment kodu został dla mnie naprawiony!
Zmodyfikowany kod @JohnnyCoder
HTML:
JS:
źródło
Naprawiłem to za pomocą kodu poniżej:
Jeśli chcesz zagrać, użyj:
Podobnie, gdy chcesz wstrzymać:
źródło
Oto inne rozwiązanie, jeśli powodem jest to, że pobieranie wideo jest bardzo wolne, a wideo nie zostało zbuforowane:
if (videoElement.state.paused) { videoElement.play(); } else if (!isNaN(videoElement.state.duration)) { videoElement.pause(); }
źródło
Wygląda na to, że wielu programistów napotkało ten problem. rozwiązanie powinno być dość proste. element media powraca
Promise
z akcji tzwpowinien załatwić sprawę
źródło
oto rozwiązanie z bloga Google:
źródło
Wszystkie nowe filmy obsługują przeglądarkę, aby były automatycznie odtwarzane z wyciszeniem, więc proszę umieścić coś takiego
Adres URL wideo powinien być zgodny ze stanem SSL, jeśli Twoja witryna korzysta z protokołu https, a następnie adres URL wideo powinien również mieć format https i taki sam dla protokołu HTTP
źródło
Najczystszych i najprostsze rozwiązanie:
źródło
Powód pierwszy - wywołanie pauzy bez czekania na rozwiązanie obietnicy gry
zbyt wiele odpowiedzi na ten scenariusz, więc odwołam się do najlepszego dokumentu dotyczącego tego problemu:
https://developers.google.com/web/updates/2017/06/play-request-was-interrupted
Powód drugi - wywołanie gry, gdy karta nie jest aktywna
W takim przypadku przeglądarka może przerwać
play
wywołaniepause
gdy karta nie jest aktywna. w celu oszczędzania zasobów dla aktywnej karty.Możesz więc po prostu poczekać, aż zakładka zostanie aktywowana, zanim wywołasz grę:
źródło
Napotkałem ten sam problem i rozwiązałem go, dynamicznie dodając
autoplay
atrybut, zamiast używaćplay()
. W ten sposób przeglądarka zorientowała się, że gra bez uruchamiania wyścigu.źródło
Próbując spowodować, aby automatycznie odtwarzany film zapętlał się, dzwoniąc
play()
po jego zakończeniu, obejście limitu czasu nie zadziałało (niezależnie od tego, jak długi jest limit czasu).Ale odkryłem, że klonując / zastępując wideo jQuery po zakończeniu, zapętli się poprawnie.
Na przykład:
i
Używam Chrome 54.0.2840.59 (64-bitowy) / OS X 10.11.6
źródło
Myślę, że zaktualizowali wideo HTML5 i wycofali niektóre kodeki. U mnie zadziałało po usunięciu kodeków.
W poniższym przykładzie:
źródło
Kiedy widzisz błąd z
Uncaught (in promise)
To oznacza po prostu, że musisz obsłużyć obietnicę za pomocą.catch()
W tym przypadku.play()
zwraca obietnicę. Możesz zdecydować, czy chcesz zarejestrować wiadomość, uruchomić kod, czy nic nie robić, ale dopóki masz.catch()
błąd, błąd zniknie.źródło
Użyłem sztuczki, aby przeciwdziałać temu problemowi. Zdefiniuj zmienną globalną var audio;
i podczas kontroli działania
i w funkcji stop
więc następne połączenie
audio.play
audio będzie gotowe od „0” currentTimeużyłem
ale to nie zadziałało. Dzięki.
źródło