Ответ 1
вместо stop()
вы можете попробовать:
sound.pause();
sound.currentTime = 0;
это должно иметь желаемый эффект
Я играю небольшой звуковой клип по щелчку каждой ссылки в моей навигации.
Код 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();
});
Он работает нормально до сих пор.
Проблема заключается в том, что звуковой клип уже запущен, и я нажимаю на любую ссылку, ничего не происходит.
Я попытался остановить уже воспроизводимый звук при нажатии ссылки, но нет прямого события для этого в HTML5 Audio API
Я пробовал следующий код, но он не работает
$.each($('audio'), function () {
$(this).stop();
});
Любые предложения, пожалуйста?
вместо stop()
вы можете попробовать:
sound.pause();
sound.currentTime = 0;
это должно иметь желаемый эффект
сначала вам нужно установить идентификатор для вашего аудиоэлемента
в js:
var ply = document.getElementById('player');
var oldSrc = ply.src;
//просто чтобы вспомнить старый источник
ply.src = "";
//чтобы остановить игрока, вам нужно заменить источник ничем.
Вот мой способ сделать метод stop():
Где-то в коде:
audioCh1: document.createElement("audio");
а затем в stop():
this.audioCh1.pause()
this.audioCh1.src = 'data:audio/wav;base64,UklGRiQAAABXQVZFZm10IBAAAAABAAEAVFYAAFRWAAABAAgAZGF0YQAAAAA=';
Таким образом, мы не создаем дополнительный запрос, старый отменяется, и наш аудио-элемент находится в чистом состоянии (тестируется в Chrome и FF): >
Из моей собственной функции javascript для переключения Play/Pause - поскольку я обрабатываю радиопоток, я хотел, чтобы он очистил буфер, чтобы слушатель не вышел из синхронизации с радиостанцией.
function playStream() {
var player = document.getElementById('player');
(player.paused == true) ? toggle(0) : toggle(1);
}
function toggle(state) {
var player = document.getElementById('player');
var link = document.getElementById('radio-link');
var src = "http://192.81.248.91:8159/;";
switch(state) {
case 0:
player.src = src;
player.load();
player.play();
link.innerHTML = 'Pause';
player_state = 1;
break;
case 1:
player.pause();
player.currentTime = 0;
player.src = '';
link.innerHTML = 'Play';
player_state = 0;
break;
}
}
Выключается, просто очистка currentTime не разрезает его в Chrome, необходимо очистить источник и загрузить его обратно. Надеюсь, это поможет.
В качестве дополнительной заметки и потому, что я недавно использовал метод stop, предоставленный в принятом ответе, согласно этой ссылке:
https://developer.mozilla.org/en-US/docs/Web/Guide/Events/Media_events
установив currentTime вручную, можно запустить событие "canplaythrough" на аудиоэлементе. В ссылке упоминается Firefox, но я столкнулся с этим запуском события после установки currentTime вручную в Chrome. Поэтому, если у вас есть поведение, связанное с этим событием, вы можете оказаться в аудиокоде.
shamangeorge писал (а):
установив currentTime вручную, можно запустить событие "canplaythrough" на аудиоэлементе.
Это действительно то, что произойдет, и приостановка также вызовет событие pause
, оба из которых делают этот метод непригодным для использования в качестве метода "остановки". Более того, установка src
, как было предложено zaki, заставит игрока попытаться загрузить текущий URL-адрес страницы в качестве медиафайла (и выйти из строя), если включена autoplay
- установка src
на null
не разрешена; он всегда будет рассматриваться как URL-адрес. Короче, чем уничтожить объект игрока, кажется, нет хорошего способа обеспечить метод "остановки", поэтому я бы предложил просто отбросить выделенную кнопку остановки и предоставить паузу и пропустить назад кнопки вместо этого - кнопка останова на самом деле не добавит никакой функции.
Этот метод работает:
audio.pause();
audio.currentTime = 0;
Но если вы не хотите писать эти две строки кода каждый раз, когда вы останавливаете аудио, вы можете сделать одну из двух вещей. Второй, который я считаю более подходящим, и я не уверен, почему "боги стандартов javascript" не сделали этого стандарта.
Первый метод: создать функцию и передать аудио
function stopAudio(audio) {
audio.pause();
audio.currentTime = 0;
}
//then using it:
stopAudio(audio);
Второй метод (предпочтительный): расширение класса Audio:
Audio.prototype.stop = function() {
this.pause();
this.currentTime = 0;
};
У меня есть это в файле javascript, который я назвал "AudioPlus.js", который я включаю в свой html перед любым script, который будет иметь дело с аудио.
Затем вы можете вызвать функцию остановки на звуковых объектах:
audio.stop();
ВЫЯВЛЕННЫЙ ХРОМ ВОПРОС С "canplaythrough":
Я не тестировал это во всех браузерах, но это проблема, с которой я столкнулся в Chrome. Если вы попытаетесь установить currentTime на аудио, к которому подключен прослушиватель событий canplaythrough, вы снова активируете это событие, что может привести к нежелательным результатам.
Таким образом, решение, похожее на все случаи, когда вы подключили прослушиватель событий, что вы действительно хотите убедиться, что он не запускается снова, заключается в удалении прослушивателя событий после первого вызова. Что-то вроде этого:
//note using jquery to attach the event. You can use plain javascript as well of course.
$(audio).on("canplaythrough", function() {
$(this).off("canplaythrough");
// rest of the code ...
});
БОНУС:
Обратите внимание, что вы можете добавить еще более настраиваемые методы в класс Audio (или любой собственный класс javascript, если на то пошло).
Например, если вы хотите использовать метод перезапуска, который перезапустил звук, он мог бы выглядеть примерно так:
Audio.prototype.restart= function() {
this.pause();
this.currentTime = 0;
this.play();
};
У меня была такая же проблема. Стоп должен остановить поток, и онлайновое воспроизведение будет жить, если это радио. Все решения, которые я видел, имели недостаток:
player.currentTime = 0
продолжает загрузку потока.player.src = ''
событие error
Мое решение:
var player = document.getElementById('radio');
player.pause();
player.src = player.src;
И HTML
<audio src="http://radio-stream" id="radio" class="hidden" preload="none"></audio>
Этот подход является "грубой силой", но он работает, предполагая, что использование jQuery "разрешено". Оборудуйте свой тэг <audio></audio>
с помощью div (здесь с идентификатором "plHolder" ).
<div id="plHolder">
<audio controls id="player">
...
</audio>
<div>
Затем этот javascript должен работать:
function stopAudio() {
var savePlayer = $('#plHolder').html(); // Save player code
$('#player').remove(); // Remove player from DOM
$('#FlHolder').html(savePlayer); // Restore it
}
Я считаю, что было бы хорошо проверить, воспроизводится ли аудио состояние и reset свойство currentTime.
if (sound.currentTime !== 0 && (sound.currentTime > 0 && sound.currentTime < sound.duration) {
sound.currentTime = 0;
}
sound.play();
для меня этот код работает нормально. (IE10 +)
var Wmp = document.getElementById("MediaPlayer");
Wmp.controls.stop();
<object classid="clsid:6BF52A52-394A-11D3-B153-00C04F79FAA6"
standby="Loading áudio..." style="width: 100%; height: 170px" id="MediaPlayer">...
Надеюсь на эту помощь.
Что мне нравится делать, так это полностью удалить элемент управления с помощью Angular2, после чего он перезагружается, когда следующая песня имеет путь аудио:
<audio id="audioplayer" *ngIf="song?.audio_path">
Затем, когда я хочу выгрузить его в код, я делаю это:
this.song = Object.assign({},this.song,{audio_path: null});
Когда следующая песня назначена, элемент управления полностью воссоздается с нуля:
this.song = this.songOnDeck;
Простой способ обойти эту ошибку состоит в том, чтобы поймать ошибку.
audioElement.play() возвращает обещание, поэтому следующий код с .catch() должен решить эту проблему:
function playSound(sound) {
sfx.pause();
sfx.currentTime = 0;
sfx.src = sound;
sfx.play().catch(e => e);
}