Я проигрываю небольшой аудиоклип по нажатию каждой ссылки в моей навигации.
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>
JS код:
$('#links a').click(function(e) {
e.preventDefault();
var beepOne = $("#beep-one")[0];
beepOne.play();
});
Пока все отлично работает.
Проблема в том, что аудиоклип уже запущен, и я нажимаю на любую ссылку, ничего не происходит.
Я пытался остановить уже воспроизводимый звук при нажатии на ссылку, но прямого события для этого в Audio API HTML5 нет.
Я попробовал следующий код, но он не работает
$.each($('audio'), function () {
$(this).stop();
});
Любые предложения, пожалуйста?
html
html5-audio
Алок Джайн
источник
источник
<audio>
загрузка продолжается также сpreload
принудительным атрибутомnone
и<source>
s src удален.Сначала вы должны установить идентификатор для вашего аудио элемента
в вашем JS:
var ply = document.getElementById('player');
var oldSrc = ply.src;
// просто чтобы запомнить старый источникply.src = "";
// чтобы остановить плеер, вы должны заменить источник ничемисточник
Вот мой способ сделать метод stop ():
Где-то в коде:
а затем в stop ():
Таким образом, мы не производим дополнительный запрос, старый отменяется, а наш аудиоэлемент находится в чистом состоянии (проверено в Chrome и FF):>
источник
У меня была такая же проблема. Остановка должна остановить поток и onplay идти в прямой эфир , если это радио. Все решения, которые я видел, имели недостаток :
player.currentTime = 0
продолжает скачивать стрим.player.src = ''
поднятьerror
событиеМое решение:
И HTML
источник
Security Error: Content at https://localhost/url.html may not load data from blob:https://localhost/cac32534-78b0-4a62-8355-cc8f1e708d64.
] Похоже, что она не оказывает отрицательного влияния, поскольку код продолжает выполняться после этого (в отличие от неперехваченного исключения).Этот метод работает:
Но если вы не хотите писать эти две строки кода каждый раз, когда останавливаете звук, вы можете сделать одну из двух вещей. Второе, я думаю, является более подходящим, и я не уверен, почему «боги стандартов javascript» не сделали этот стандарт.
Первый способ: создать функцию и передать аудио
Второй метод (предпочтительный): расширить класс Audio:
У меня есть это в файле JavaScript, который я назвал «AudioPlus.js», который я включаю в свой HTML-код перед любым сценарием, который будет иметь дело с аудио.
Затем вы можете вызвать функцию остановки на аудиообъектах:
ЗАКЛЮЧИТЕЛЬНО ВЫПУСК ХРОМА С «canplaythrough»:
Я не проверял это во всех браузерах, но это проблема, с которой я столкнулся в Chrome. Если вы попытаетесь установить currentTime для аудио, к которому подключен прослушиватель событий canplaythrough, то вы снова вызовете это событие, что может привести к нежелательным результатам.
Таким образом, решение, аналогичное всем случаям, когда вы подключили прослушиватель событий, который вы действительно хотите удостовериться, что он больше не запускается, состоит в том, чтобы удалить прослушиватель событий после первого вызова. Что-то вроде этого:
БОНУС:
Обратите внимание, что вы можете добавить еще больше пользовательских методов в класс Audio (или любой собственный класс javascript в этом отношении).
Например, если вам нужен метод «рестарт», который перезапускает аудио, он может выглядеть примерно так:
источник
function stopAudio(audio) { audio.pause(); this.audioStream.src = ""; }
Это помогло мне убрать значок динамика в браузере Chrome, который появляется, когда на странице воспроизводится звук. протестировано на Chrome версии 59.0.3071.109От моей собственной функции javascript до переключения Play / Pause - поскольку я обрабатываю радиопоток, я хотел, чтобы он очистил буфер, чтобы слушатель не заканчивал синхронизацию с радиостанцией.
Оказывается, просто очистка currentTime не обрезает его в Chrome, необходимо также очистить исходный код и загрузить его обратно. Надеюсь, это поможет.
источник
В качестве примечания и потому, что я недавно использовал метод остановки, указанный в принятом ответе, по этой ссылке:
https://developer.mozilla.org/en-US/docs/Web/Guide/Events/Media_events
установив currentTime вручную, можно запустить событие canplaythrough для аудиоэлемента. В ссылке упоминается Firefox, но я столкнулся с этим событием после того, как вручную установил currentTime в Chrome. Так что, если у вас есть поведение, связанное с этим событием, вы можете оказаться в аудио цикле.
источник
Иногда это не работает в Chrome,
просто так изменить,
источник
Shamangeorge писал (а):
Это действительно то, что произойдет, и пауза также вызовет
pause
событие, оба из которых делают эту технику непригодной для использования в качестве метода «остановки». Более того, установка параметра,src
предложенного zaki, заставит проигрыватель попытаться загрузить URL-адрес текущей страницы как файл мультимедиа (и потерпеть неудачу), еслиautoplay
он включен - установкаsrc
наnull
недопустима; он всегда будет рассматриваться как URL. Если не считать уничтожения объекта проигрывателя, кажется, нет хорошего способа обеспечить метод «стоп», поэтому я бы предложил просто отпустить выделенную кнопку «стоп» и вместо этого предоставить кнопки «пауза» и «назад» - кнопка «стоп» на самом деле не добавит никакой функциональности. ,источник
Этот подход "грубая сила", но он работает, предполагая, что использование jQuery "разрешено". Окружите свои
<audio></audio>
теги "player" div (здесь с идентификатором "plHolder").Тогда этот JavaScript должен работать:
источник
#FlHolder
кажется опечаткой для#plHolder
src
атрибут игрока.Я считаю, что было бы хорошо проверить, воспроизводится ли звук, и сбросить свойство currentTime.
источник
для меня этот код работает нормально. (IE10 +)
Надеюсь, это поможет.
источник
Что мне нравится делать, так это полностью удалять элемент управления с помощью Angular2, затем он перезагружается, когда следующая песня имеет звуковой путь:
Затем, когда я хочу выгрузить его в коде, я делаю это:
Когда назначается следующая песня, элемент управления полностью воссоздается с нуля:
источник
Самый простой способ обойти эту ошибку - поймать ее.
audioElement.play () возвращает обещание, поэтому для решения этой проблемы должно быть достаточно следующего кода с .catch ():
Примечание: вы можете заменить функцию стрелки на анонимную функцию для обратной совместимости.
источник