HTML5 Audio Looping - PullRequest
       8

HTML5 Audio Looping

73 голосов
/ 18 июля 2010

Я недавно играл со звуком HTML5, и хотя я могу заставить его воспроизводить звук, он будет проигрываться только один раз.Независимо от того, что я пытаюсь (установка свойств, обработчиков событий и т. Д.), Я не могу заставить его зацикливаться.

Вот основной код, который я использую:

//myAudio is declared at a global scope, so it doesn't get garbage collected.
myAudio = new Audio('someSound.ogg');
myAudio.loop = true;
myAudio.play();

Я тестирую с использованием Chrome (6.0.466.0 dev) и Firefox (4 beta 1), которые оба рады игнорировать мои запросы на зацикливание.Есть идеи?

ОБНОВЛЕНИЕ : теперь свойство цикла поддерживается во всех основных браузерах.

Ответы [ 9 ]

105 голосов
/ 18 июля 2010

Хотя указано loop, оно не реализовано в ни в одном браузере, о котором я знаю Firefox [спасибо Anurag за это] .Вот альтернативный способ зацикливания, который должен работать в браузерах с поддержкой HTML5:

myAudio = new Audio('someSound.ogg'); 
myAudio.addEventListener('ended', function() {
    this.currentTime = 0;
    this.play();
}, false);
myAudio.play();
61 голосов
/ 23 июня 2011

Чтобы добавить еще несколько советов, объединяющих предложения @kingjeffrey и @CMS: вы можете использовать loop там, где он доступен, и использовать обработчик событий kingjeffrey, когда его нет. Есть веская причина, почему вы хотите использовать loop, а не писать свой собственный обработчик событий: как обсуждалось в сообщении об ошибке Mozilla , в то время как loop в настоящее время не проходит без проблем (без пробела) любой броузер, о котором я знаю, это, безусловно, возможно и, вероятно, станет стандартом в будущем. Ваш собственный обработчик событий никогда не будет бесшовным в любом браузере (так как он должен прокачивать через цикл событий JavaScript). Поэтому лучше использовать loop, где это возможно, вместо того, чтобы писать собственное событие. Как указала CMS в комментарии к ответу Anurag, вы можете обнаружить поддержку loop, запросив переменную loop - если она поддерживается, она будет булевой (false), в противном случае она будет неопределенной, как в настоящее время. находится в Firefox.

Соединяя их вместе:

myAudio = new Audio('someSound.ogg'); 
if (typeof myAudio.loop == 'boolean')
{
    myAudio.loop = true;
}
else
{
    myAudio.addEventListener('ended', function() {
        this.currentTime = 0;
        this.play();
    }, false);
}
myAudio.play();
17 голосов
/ 18 июля 2010

Ваш код работает для меня в Chrome (5.0.375) и Safari (5.0). Не зацикливается на Firefox (3.6).

См. Пример.

var song = new Audio("file");
song.loop = true;
document.body.appendChild(song);​
3 голосов
/ 29 апреля 2015
var audio = new Audio("http://rho.nu/pub/Game%20Of%20Thrones%20-%20Main%20Theme%20-%20Soundtrack.mp3");

audio.addEventListener('canplaythrough', function() {
    this.currentTime = this.duration - 10;
    this.loop = true;
    this.play();
});

Просто установите значение loop = true в списке событий canplaythrough.

http://jsbin.com/ciforiwano/1/edit?html,css,js,output

2 голосов
/ 02 марта 2012

Попробуйте использовать jQuery для прослушивателя событий, тогда он будет работать в Firefox.

myAudio = new Audio('someSound.ogg');

$(myAudio).bind('ended', function()  {
    myAudio.currentTime = 0;
    myAudio.play();
});

myAudio.play();

Нечто подобное.

1 голос
/ 29 марта 2018

Самый простой способ:

bgSound = new Audio("sounds/background.mp3");
bgSound.loop = true;
bgSound.play();
1 голос
/ 11 июня 2012

Я так и сделал,

<audio controls="controls" loop="loop">
<source src="someSound.ogg" type="audio/ogg" />
</audio>

и это выглядит так

enter image description here

0 голосов
/ 11 марта 2015

Вы можете попробовать setInterval, если вы знаете точную длину звука.Вы можете заставить setInterval воспроизводить звук каждые x секунд.X будет длиной вашего звука.

0 голосов
/ 31 октября 2013

Это работает, и намного проще переключить, чем приведенные выше методы:

использовать в строке: onended="if($(this).attr('data-loop')){ this.currentTime = 0; this.play(); }"

Включите цикл с помощью $(audio_element).attr('data-loop','1'); Выключите цикл на $(audio_element).removeAttr('data-loop');

...