Цикл аудіозаписів HTML5


80

Нещодавно я грав з аудіо 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), які, здається, із задоволенням ігнорують мої запити на цикл. Будь-які ідеї?

ОНОВЛЕННЯ : Властивість циклу тепер підтримується у всіх основних браузерах.


1
Не впевнений у Chrome, але Firefox не підтримує цикл.
luiscubal

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

@Brandon Цікаво, чому це не працює? Єдина відмінність цього коду від прийнятої відповіді полягає в тому, що у прийнятій відповіді він встановлює currentTimeзначення 0 перед викликом play. Це потрібно?
mgiuca

2
@Brandon Так, див. Другий коментар Кінгджеффрі щодо його власної відповіді. Вам потрібно встановити currentTime.
mgiuca

Це справді чудово працює (принаймні сьогодні)
dvlden,

Відповіді:


118

Поки loopвказано, воно не реалізовано вбудь-який відомий мені браузер Firefox [дякую Анурагу за те, що на це вказав] . Ось альтернативний спосіб циклу, який повинен працювати в браузерах, що підтримують HTML5:

var 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"
Тодзі

1
@Toji Ось документація щодо помилки INDEX_SIZR_ERR . Це означає, що початок пісні знаходиться за межами діапазону, який може шукати браузер. Це іноді трапляється, якщо браузер вважає, що це потокове мультимедіа, або якщо серверу не вистачає певних можливостей (я забув відразу, що це за конкретна можливість, але спробую її відстежити). Ви також можете використовувати, this.startTimeщоб повернутися до самого раннього доступного часу.
kingjeffrey

@Toji Причина .currentTimeпотрібна пов’язана з тим, як специфікація обробляє кінець пісні. Браузери повинні просто призупинити пісню. Тож відновлення гри робить це в кінці пісні. Потрібно скинути головку відтворення.
Кінгджефрі

@Toji Ось ще одна думка, якщо ви не можете почати .currentTimeпрацювати. Усередині функції зворотного виклику ви можете просто myAudioповторно оголосити той самий файл і відтворити його знову. Перевизначивши його, слід також скинути головку відтворення на початок пісні.
Кінгджефрі

встановивши його на this.startTime видає ту саму помилку, хоча зараз я починаю гадати, чи це проблема сервера. Я обслуговую статичні файли з локального сервера django (що не є найнадійнішою функцією django). Поєднайте це з тим, що Анураг працює, і я думаю, що це, мабуть, лише я. Я пограюсь із ним ще трохи і повідомлю вам результати.
Тодзі

61

Щоб додати ще кілька порад, що поєднують пропозиції @kingjeffrey та @CMS: Ви можете використовувати loopтам, де це доступно, і повернутися до обробника подій kingjeffrey, коли цього немає. Існує вагома причина, чому ви хочете використовувати, loopа не писати власний обробник подій: Як уже обговорювалося у звіті про помилки Mozilla , хоча в loopданий час він не циклічно (без прогалини) в жодному відомому мені браузері, це, безумовно, можливо стати стандартом у майбутньому. Ваш власний обробник подій ніколи не буде бездоганним у будь-якому браузері (оскільки він повинен прокачуватись через цикл подій JavaScript). Тому найкраще використовувати loopтам, де це можливо, замість того, щоб писати власну подію. Як зазначив CMS у коментарі до відповіді Анурага,looploop змінна - якщо вона підтримується, вона буде логічною (помилковою), інакше вона буде невизначеною, як і зараз у 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();

Дякую. це чудово працювало для Opera, Firefox, Chrome ... так як ми можемо додати більше звуків (mp3) для Safari .... ??? додавання більше змінних, ймовірно, призведе до дублікатів для Chrome (який підтримує ogg та mp3) ...

@pixelass Я не зовсім впевнений, як це зробити в коді. У HTML ви вкладете теги <audio> один в одного, а браузер вибере найвіддаленіший, який відповідає. Я не знаю, чи можете ви зробити це вкладання в програмний аудіо-об'єкт. Але ви можете, звичайно, запрограмувати його самостійно: перевірте метод Audio.canPlayType.
mgiuca 02

мені відомий метод html. Я можу спробувати з методом Audio.canPlayType. зараз я використовую 2 змінні, тому в chrome відтворюються 2 файли. це насправді не має великого значення, оскільки це лише якась петля океанських хвиль, яку я зробив. ... але просто додати 2 джерела було б набагато приємніше. pixelass.com, якщо вам все одно.

19

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

Див. Приклад.

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

+1 Дуже круто. Я не знав, що це loopбуло реалізовано в webkit.
kingjeffrey

10
+1, ви також можете визначити, чи loopпідтримується це, наприклад:typeof new Audio().loop == 'boolean';
Крістіан С. Сальвадо

@CMS Уникайте використання ==та використання ===, це кращий оператор для початківців і кращий за продуктивність.
Klaider

Чи сумісно це з Firefox 80?
Мостафіз Рахман,

4
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


4

Найпростіший спосіб:

bgSound = new Audio("sounds/background.mp3");
bgSound.loop = true;
bgSound.play();

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>

і це виглядає так

введіть тут опис зображення


0

Це працює, і набагато простіше переключитись, що описані вище методи:

використовувати вбудований: 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 - це довжина вашого звуку.


Це не дає відповіді на запитання. Щоб критикувати або вимагати роз’яснень від автора, залиште коментар під його публікацією - ви завжди можете коментувати власні публікації, і коли у вас буде достатня репутація, ви зможете коментувати будь-яку публікацію .
Alex Char,

4
@AlexChar Я не згоден. Це принаймні спроба відповісти на питання. Це може отримати користь від розширення, щоб точно показати, як може виглядати код, і це, мабуть, не найкращий спосіб вирішити проблему, але це не "не відповідь".
Ентоні Гріст,

Роблячи це, щоб отримати проблеми з досвідом.
Klaider
Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.