Odtwarzam mały klip audio po kliknięciu każdego łącza w mojej nawigacji
Kod HTML:
<audio tabindex="0" id="beep-one" controls preload="auto" >
<source src="audio/Output 1-2.mp3">
<source src="audio/Output 1-2.ogg">
</audio>
Kod JS:
$('#links a').click(function(e) {
e.preventDefault();
var beepOne = $("#beep-one")[0];
beepOne.play();
});
Jak dotąd działa dobrze.
Problem polega na tym, że klip dźwiękowy jest już uruchomiony i klikam dowolny link, nic się nie dzieje.
Próbowałem zatrzymać już odtwarzany dźwięk po kliknięciu linku, ale nie ma bezpośredniego zdarzenia w interfejsie API audio HTML5
Próbowałem śledzić kod, ale nie działa
$.each($('audio'), function () {
$(this).stop();
});
Jakieś sugestie?
html
html5-audio
Alok Jain
źródło
źródło
<audio>
ładuje się również zpreload
atrybutem wymuszonymnone
i<source>
usuniętym src.najpierw musisz ustawić identyfikator dla swojego elementu audio
w twoim js:
var ply = document.getElementById('player');
var oldSrc = ply.src;
// tylko po to, by zapamiętać stare źródłoply.src = "";
// aby zatrzymać odtwarzacz, musisz zastąpić źródło niczymźródło
Oto mój sposób na zrobienie metody stop ():
Gdzieś w kodzie:
a następnie w stop ():
W ten sposób nie generujemy dodatkowego żądania, stary jest anulowany, a nasz element audio jest w stanie czystym (testowane w Chrome i FF):>
źródło
Miałem ten sam problem. Zatrzymanie powinno zatrzymać transmisję i włączyć odtwarzanie, jeśli jest to radio. Wszystkie rozwiązania, które widziałem, miały jedną wadę :
player.currentTime = 0
ciągle pobiera strumień.player.src = ''
podnieśćerror
wydarzenieMoje rozwiązanie:
I HTML
źródło
Security Error: Content at https://localhost/url.html may not load data from blob:https://localhost/cac32534-78b0-4a62-8355-cc8f1e708d64.
] Wydaje się, że nie ma to żadnego negatywnego wpływu, ponieważ kod nadal jest wykonywany po tym (w przeciwieństwie do nieprzechwyconego wyjątku).Ta metoda działa:
Ale jeśli nie chcesz pisać tych dwóch wierszy kodu za każdym razem, gdy zatrzymujesz dźwięk, możesz zrobić jedną z dwóch rzeczy. Myślę, że drugi jest bardziej odpowiedni i nie jestem pewien, dlaczego „bogowie standardów javascript” nie stworzyli tego standardu.
Pierwsza metoda: utwórz funkcję i przekaż dźwięk
Druga metoda (preferowana): rozszerz klasę Audio:
Mam to w pliku javascript, który nazwałem „AudioPlus.js”, który umieszczam w moim html przed każdym skryptem, który będzie zajmował się dźwiękiem.
Następnie możesz wywołać funkcję stop na obiektach audio:
WRESZCIE PROBLEM Z CHROMEM Z „Canplaythrough”:
Nie testowałem tego we wszystkich przeglądarkach, ale jest to problem, na który natknąłem się w Chrome. Jeśli spróbujesz ustawić currentTime dla dźwięku, do którego jest dołączony detektor zdarzenia „canplaythrough”, ponownie uruchomisz to zdarzenie, co może prowadzić do niepożądanych rezultatów.
Tak więc rozwiązaniem, podobnym do wszystkich przypadków, w których dołączyłeś detektor zdarzeń, który naprawdę chcesz mieć pewność, że nie zostanie ponownie uruchomiony, jest usunięcie nasłuchiwania zdarzeń po pierwszym wywołaniu. Coś takiego:
PREMIA:
Zauważ, że możesz dodać jeszcze więcej niestandardowych metod do klasy Audio (lub dowolnej natywnej klasy javascript).
Na przykład, jeśli potrzebujesz metody „restartu”, która ponownie uruchamia dźwięk, może to wyglądać mniej więcej tak:
źródło
function stopAudio(audio) { audio.pause(); this.audioStream.src = ""; }
W końcu zadziałało to dla mnie i usunęło ikonę głośnika w przeglądarce Chrome, która pojawia się podczas odtwarzania dźwięku na stronie. testowano na Chrome w wersji 59.0.3071.109Z mojej własnej funkcji javascript do przełączania odtwarzania / wstrzymywania - ponieważ obsługuję strumień radiowy, chciałem, aby wyczyścił bufor, aby słuchacz nie stracił synchronizacji ze stacją radiową.
Okazuje się, że samo wyczyszczenie currentTime nie powoduje przerwania go w Chrome, konieczne jest również wyczyszczenie źródła i ponowne załadowanie. Mam nadzieję, że to pomoże.
źródło
Na marginesie i ponieważ ostatnio korzystałem z metody stop podanej w zaakceptowanej odpowiedzi, zgodnie z tym linkiem:
https://developer.mozilla.org/en-US/docs/Web/Guide/Events/Media_events
ustawiając ręcznie currentTime można uruchomić zdarzenie „canplaythrough” na elemencie audio. W linku wspomina o Firefoksie, ale napotkałem to zdarzenie uruchamiające się po ręcznym ustawieniu currentTime w Chrome. Więc jeśli masz jakieś zachowanie związane z tym wydarzeniem, możesz skończyć w pętli audio.
źródło
Czasami nie działa w chrome,
po prostu zmień się w ten sposób,
źródło
shamangeorge napisał:
Tak właśnie się stanie, a wstrzymanie również wyzwoli
pause
zdarzenie, co sprawia, że ta technika nie nadaje się do stosowania jako metoda „stop”. Co więcej, ustawieniesrc
zgodnie z sugestią zaki spowoduje, że odtwarzacz spróbuje załadować adres URL bieżącej strony jako plik multimedialny (i zakończy się niepowodzeniem), jeśliautoplay
jest włączony - ustawieniesrc
nanull
nie jest dozwolone; zawsze będzie traktowany jako adres URL. Oprócz zniszczenia obiektu gracza, wydaje się, że nie ma dobrego sposobu na zapewnienie metody „stop”, więc sugerowałbym po prostu upuszczenie dedykowanego przycisku zatrzymania i zamiast tego zapewnienie przycisków pauzy i przeskoku - przycisk zatrzymania nie dodawałby żadnej funkcjonalności .źródło
To podejście jest „brutalną siłą”, ale działa przy założeniu, że używanie jQuery jest „dozwolone”. Otocz
<audio></audio>
znaczniki „player” znacznikiem div (tutaj z identyfikatorem „plHolder”).Wtedy ten javascript powinien działać:
źródło
#FlHolder
wydaje się być literówką#plHolder
src
atrybut gracza.Uważam, że dobrze byłoby sprawdzić, czy dźwięk jest odtwarzany i zresetować właściwość currentTime.
źródło
dla mnie ten kod działa dobrze. (IE10 +)
Mam nadzieję, że to pomoże.
źródło
Lubię całkowicie usuwać kontrolkę za pomocą Angular2, a następnie ładować ją ponownie, gdy następny utwór ma ścieżkę audio:
Następnie, gdy chcę wyładować go w kodzie, robię to:
Po przypisaniu następnego utworu formant zostanie całkowicie odtworzony od zera:
źródło
Prostym sposobem obejścia tego błędu jest wychwycenie błędu.
audioElement.play () zwraca obietnicę, więc poniższy kod z .catch () powinien wystarczyć do rozwiązania tego problemu:
Uwaga: możesz chcieć zastąpić funkcję strzałkową funkcją anonimową w celu zapewnienia zgodności z poprzednimi wersjami.
źródło