2010-07-17 3 views
66

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

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

//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 бета-1), оба из которых, кажется, рад игнорировать мои просьбы о зацикливание. Есть идеи?

UPDATE: Свойство loop теперь supported во всех основных браузерах.

+1

Не уверен, что Chrome, Firefox, но не поддерживает зацикливание. – luiscubal

+1

Просто запустите его, как только он закончится: myAudio.addEventListener («закончился», функция (e) {myAudio.play();}, false); – mattbasta

+0

не работает !!!! – gravitation

ответ

95

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

myAudio = new Audio('someSound.ogg'); 
myAudio.addEventListener('ended', function() { 
    this.currentTime = 0; 
    this.play(); 
}, false); 
myAudio.play(); 
+1

Хм ... интересно. Раньше у меня не было большой удачи в этом методе, но я не настраивал текущее время. Когда я пытаюсь это сделать, я получаю: «Не удалось получить ошибку: INDEX_SIZE_ERR: DOM Exception 1» в строке «this.currentTime = 0» – Toji

+1

@Toji Вот документация для [INDEX_SIZR_ERR error] (http: // www .whatwg.org/функция/веб-приложения/текущие работы/многостраничный/video.html # смещение-в-The-медиа-ресурсы). Это означает, что начало песни находится за пределами диапазона, который может искать браузер. Это иногда происходит, если браузер считает, что это потоковое мультимедиа, или если на сервере не хватает определенных возможностей (я забываю, что это определенная возможность, но я попытаюсь отследить его). Вы также можете использовать 'this.startTime' для возврата к самому раннему доступному времени. – kingjeffrey

+0

@Toji Причина '.currentTime' необходима, так как spec обрабатывает конец песни. Браузеры должны просто приостанавливать песню. Так что возобновление игры делает это в конце песни. Плей-лист должен быть сброшен. – kingjeffrey

14

Ваш код работает для меня на Chrome (5.0.375) и Safari (5,0). Не работает в Firefox (3.6).

See example.

var song = new Audio("file"); 
song.loop = true; 
document.body.appendChild(song);​ 
+0

+1 Очень круто. Я не знал, что «loop» был реализован в webkit. – kingjeffrey

+10

+1, вы также можете определить, поддерживается ли 'loop', например. by: 'typeof new Audio(). loop == 'boolean';' – CMS

+0

@CMS Избегайте использования '==' и используйте '===', это лучший оператор для начинающих и лучше для производительности. – Hydro

56

Чтобы добавить еще несколько советов, сочетающий в себе предложения @kingjeffrey и @CMS: Вы можете использовать loop, где он доступен и упасть обратно на обработчик события kingjeffrey, когда это не так. Есть хорошая причина, по которой вы хотите использовать loop, а не писать собственный обработчик событий: как обсуждалось в Mozilla bug report, а 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(); 
+0

+1, потому что я искал этот код! –

+0

Thx. это отлично сработало для Opera, Firefox, Chrome ... так как мы можем добавить больше звуков (mp3) для Safari .... ??? добавление дополнительных переменных, вероятно, вызовет дубликаты для Chrome (который поддерживает ogg и mp3) ... – pixelass

+0

@pixelass Я не совсем уверен, как это сделать в коде. В HTML вы вставляете теги

2

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

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

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

myAudio.play(); 

Что-то в этом роде.

1

Я сделал это таким образом,

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

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

enter image description here

0

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

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

Включите петлю $(audio_element).attr('data-loop','1'); Поверните зацикливание на $(audio_element).removeAttr('data-loop');

0

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

+0

Это не дает ответа на вопрос. Чтобы критиковать или запросить разъяснения у автора, оставьте комментарий ниже своего сообщения - вы всегда можете прокомментировать свои собственные сообщения, и как только у вас будет достаточно [репутации] (http://stackoverflow.com/help/whats-reputation), вы будете быть в состоянии [прокомментировать любое сообщение] (http://stackoverflow.com/help/privileges/comment). –

+4

@AlexChar Я не согласен. Это, по крайней мере, попытка ответить на вопрос. Это может принести пользу некоторым расширениям, чтобы точно показать, как выглядит код, и, вероятно, это не лучший способ решить проблему, но это не «не ответ». –

+0

Делайте это, чтобы получить проблемы с проблемами. – Hydro

3
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 eventlistener.

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