Случайный звуковой скрипт HTML/JS перестал работать

Сценарий, который я использовал в течение длительного времени, не будет работать, если я не удалю некоторые аудиоссылки из списка аудиофайлов, которые будут воспроизводиться на веб-сайте. Я абсолютно не знаю, чем это вызвано.

Рассматриваемый скрипт:

<script>

var collection=[];
var loadedIndex=0;


function init(audios) {
  for(var i=0;i<audios.length;i++) {
    var audio = new Audio(audios[i]);
    collection.push(audio);
    buffer(audio);
  }
}

function buffer(audio) {
  if (audio.readyState==4)return loaded();
  setTimeout(function(){buffer(audio)},100);
}

function loaded() {
  loadedIndex++;
  if (collection.length==loadedIndex)playLooped();
}

function playLooped() {
var audio=Math.floor(Math.random() * (collection.length));
  audio=collection[audio];
  audio.play();
  setTimeout(playLooped,audio.duration*1000);
}



init([

// (Every single audio file link that I have inserted)

]);

</script>

От: https://stackoverflow.com/users/688411/khez

Воспроизведение случайного звука в HTML/Javascript

Основная цель сценария — выбрать случайный фрагмент аудио для воспроизведения при загрузке веб-сайта, а когда выбранный аудиофайл перестает воспроизводиться, он выбирает другой случайный трек для воспроизведения и так далее и тому подобное.

Все работало хорошо, поэтому я продолжал добавлять все больше и больше треков, пока он внезапно не перестал работать. Единственный способ исправить это — удалить некоторые из списка, за исключением того, что я не хотел ничего удалять, потому что треки были потрясающими / идеально подходили для сайта.

Поиск решения тоже не помог. Так что теперь я ищу способ воспроизвести множество треков, которые я вставил в этот скрипт, не нарушая его.

(Редактировать)

Ссылки, которые я использую, взяты из:

Downloads.khinsider.com (видеоигровая музыка)

Archive.org (я размещаю музыку из видеоигр 199X / 200X, если не могу найти ее на сайте VGM)

А ссылки выглядят так:

Ссылки на archive.org: https://ia601403.us.archive.org/20/items/passport1_202210/passport1.mp3

Ссылки на ВГМ: https://vgmsite.com/soundtracks/3d-minigolf-deluxe/wgbpcldrlj/Theme1.mp3

Всего в списке 70 строк треков.

Это не значит, что ссылки, которые я использую, сломаны или удалены, нет. Они отлично работают и ни один не был удален/не будет удален в будущем. Я проверил каждую ссылку в списке, и ни одна не потеряна.

(используемый фрагмент кода)

<script>

var collection=[];
var loadedIndex=0;


function init(audios) {
  for(var i=0;i<audios.length;i++) {
    var audio = new Audio(audios[i]);
    collection.push(audio);
    buffer(audio);
  }
}

function buffer(audio) {
  if (audio.readyState==4)return loaded();
  setTimeout(function(){buffer(audio)},100);
}

function loaded() {
  loadedIndex++;
  if (collection.length==loadedIndex)playLooped();
}

function playLooped() {
var audio=Math.floor(Math.random() * (collection.length));
  audio=collection[audio];
  audio.play();
  setTimeout(playLooped,audio.duration*1000);
}



init([
  'https://ia601509.us.archive.org/29/items/theme-1_202209/Theme1.mp3',
  'https://vgmsite.com/soundtracks/pilotwings-64-n64/shmuvxyn/03%20Game%20Menu.mp3',
  'https://vgmsite.com/soundtracks/1080-snowboarding-original-soundtrack/kyuermtcti/13%20review%20%28Replay%20Time%29.mp3',
  'https://vgmsite.com/soundtracks/1080-snowboarding-original-soundtrack/xzooycupop/16%20white%20out%20%28Last%20Name%20Entry%29.mp3',
  'https://vgmsite.com/soundtracks/pilotwings-64-n64/wcldvwrd/09%20Rocket%20Belt.mp3',
  'https://vgmsite.com/soundtracks/super-smash-bros.-64/mdqmottw/02%20-%20How%20to%20Play.mp3',
  'https://vgmsite.com/soundtracks/super-smash-bros.-64/mbbfevmu/04%20-%20Main%20Menu.mp3',
  'https://vgmsite.com/soundtracks/banjo-kazooie-complete/cmibeqpaly/020.%20Mumbo%27s%20Mountain%20-%20Aquatics.mp3',
  'https://vgmsite.com/soundtracks/donkey-kong-country/hhvtfdcu/02%20-%20Simian%20Segue.mp3',
  'https://vgmsite.com/soundtracks/earthbound-snes/lshsbyfpgm/30%20Onett%20Theme.mp3',
  'https://vgmsite.com/soundtracks/3d-minigolf-deluxe/wgbpcldrlj/Theme1.mp3',
  'https://vgmsite.com/soundtracks/chicken-invaders-pentalogy-the-complete-soundtrack/sggrynne/02-01.%20Main%20Theme.mp3',
  'https://vgmsite.com/soundtracks/commander-keen-4/owjkodrw/004%20-%20Robert%20Prince%20-%20Too%20Hot.mp3',
  'https://vgmsite.com/soundtracks/commander-keen-5/dphrvepv/004%20-%20Robert%20Prince%20-%20The%20Omegamatic.mp3',
  'https://vgmsite.com/soundtracks/commander-keen-5/vmliftfu/009%20-%20Robert%20Prince%20-%20Security%20Center.mp3',
  'https://vgmsite.com/soundtracks/commander-keen-5/qbtuakmh/008%20-%20Robert%20Prince%20-%20High%20Score%20Table.mp3',
  'https://vgmsite.com/soundtracks/commander-keen-5/ahxngboh/006%20-%20Robert%20Prince%20-%20Game%20Over.mp3',
  'https://vgmsite.com/soundtracks/old-school-runescape/gaccwkehoq/Harmony.mp3',
  'https://vgmsite.com/soundtracks/forsaken/xsnwaknf/06%20-%20pure%20bitch%20power.mp3',
  'https://vgmsite.com/soundtracks/hypnospace-outlaw-ost-vol.-2/vsxlvpwlze/06%20-%20Tuba%20Buffet%27s%20Brass%20Shade.mp3',
  'https://vgmsite.com/soundtracks/3d-minigolf-deluxe/ovanelsobo/Theme.mp3',
  'https://vgmsite.com/soundtracks/hypnospace-outlaw-ost-vol.-2/kxnwqerdwn/14%20-%20Cave%20Drip.mp3',
  'https://vgmsite.com/soundtracks/unreal-tournament-original-soundtrack/rytublyiyw/02.%20Unreal%20Tournament%20Menu.mp3',
  'https://vgmsite.com/soundtracks/lego-island-the-complete-soundtrack/ohklmzln/02%20-%20Opening%20Theme.mp3',
  'https://vgmsite.com/soundtracks/lego-island-the-complete-soundtrack/orsxlxvb/16%20-%20Pizzeria%20%28Beach%20Blvd.%29.mp3',
  'https://vgmsite.com/soundtracks/lego-island-remastered-cassetes/mdrtvaguth/LEGO%20Island%20Theme-01.mp3',
  'https://vgmsite.com/soundtracks/lego-island-the-complete-soundtrack/snhsyvxs/03%20-%20The%20Information%20Center.mp3',
  'https://vgmsite.com/soundtracks/lego-island-remastered-cassetes/skdekgugcq/Information%20Center.mp3',
  'https://vgmsite.com/soundtracks/lego-island-the-complete-soundtrack/enszvoam/04%20-%20Elevator.mp3',
  'https://vgmsite.com/soundtracks/lego-island-the-complete-soundtrack/gyzziywx/09%20-%20The%20Medical%20Center.mp3',
  'https://vgmsite.com/soundtracks/lego-island-the-complete-soundtrack/elsedwlu/32%20-%20Police%20Station.mp3',
  'https://vgmsite.com/soundtracks/windows-xp-windows-gamerip-2001/ncedmvrowy/XP%20Tour%20Music.mp3',
  'https://vgmsite.com/soundtracks/windows-xp-windows-gamerip-2001/bkbmzikopv/title.mp3',
  'https://vgmsite.com/soundtracks/windows-xp-windows-gamerip-2001/xmrmylwpfs/Windows%20XP%20Critical%20Stop.mp3',
  'https://vgmsite.com/soundtracks/windows-xp-windows-gamerip-2001/pludoospat/Windows%20XP%20Default.mp3',
  'https://vgmsite.com/soundtracks/windows-xp-windows-gamerip-2001/wxlfkiicfz/Windows%20XP%20Ding.mp3',
  'https://vgmsite.com/soundtracks/windows-xp-windows-gamerip-2001/eriixoucwi/Windows%20XP%20Error.mp3',
  'https://vgmsite.com/soundtracks/windows-xp-windows-gamerip-2001/uqfxdlhpiz/Windows%20XP%20Exclamation.mp3',
  'https://vgmsite.com/soundtracks/windows-xp-windows-gamerip-2001/cicfoxlvih/Windows%20XP%20Shutdown.mp3',
  'https://vgmsite.com/soundtracks/windows-xp-windows-gamerip-2001/gpdwfdkrxx/Windows%20XP%20Startup.mp3',
  'https://vgmsite.com/soundtracks/windows-xp-windows-gamerip-2001/evvwkdwoqs/Windows%20XP%20Recycle.mp3',
  'https://ia804608.us.archive.org/27/items/776e6c6f6164732f496d61676/Kalimba.mp3',
  'https://vgmsite.com/soundtracks/club-penguin-gamerip-2005-pc-mobile/egxkhnbyvu/Pizzatron%203000.mp3',
  'https://ia803200.us.archive.org/11/items/club-penguin-music/12%20-%20Jazzy%20Pizza%20Ambience.mp3',
  'https://ia803200.us.archive.org/11/items/club-penguin-music/20%20-%20Charlies%20Here%20Ambience.mp3',
  'https://ia903200.us.archive.org/11/items/club-penguin-music/20%20-%20Charlies%20Here.mp3',
  'https://vgmsite.com/soundtracks/toontown-rewritten-ost/efgjbrotfp/Main%20Theme%20Live%20-%201.%20Main%20Theme%20%28Phase%201%20-%20Relaxed%29.mp3',
  'https://vgmsite.com/soundtracks/toontown-rewritten-ost/gkhswdozxh/Main%20Theme%20Live%20-%202.%20Main%20Theme%20%28Phase%202%20-%20Active%29.mp3',
  'https://vgmsite.com/soundtracks/toontown-online/osftrqbock/Introduction%202.%20Create-a-Toon.mp3',
  'https://vgmsite.com/soundtracks/toontown-online/imtfjziarb/Neighborhood%2001.%20Toontown%20Central%20-%20Playground.mp3',
  'https://vgmsite.com/soundtracks/toontown-online/bxblzigevc/Neighborhood%2002.%20Toontown%20Central%20-%20Building.mp3',
  'https://vgmsite.com/soundtracks/mario-paint-game-rip/lcjeyuuohe/15%20Creative%20Exercise.mp3',
  'https://ia801002.us.archive.org/31/items/HoverWindowsOST/Track%202.mp3',
  'https://ia801002.us.archive.org/31/items/HoverWindowsOST/Track%201.mp3',
  'https://ia601403.us.archive.org/20/items/passport1_202210/passport1.mp3',
  'https://ia601403.us.archive.org/20/items/passport1_202210/passport2.mp3',
  'https://vgmsite.com/soundtracks/3d-frog-frenzy/aojqlxdjyq/01%20MainMenu.mp3',
  'https://vgmsite.com/soundtracks/3d-frog-frenzy/lmviuuhrfq/03%20City.mp3',
  'https://vgmsite.com/soundtracks/hudson-selection-vol.-2-star-soldier-psp/zjdaxhtj/01%20-%20BGM%2001.mp3',
  'https://vgmsite.com/soundtracks/unreal-windows-1998/wktwjboxsq/1-01%20Flight%20Castle.mp3',
  'https://vgmsite.com/soundtracks/descent-1-remake-d1x-rebirth-sc-55-version-gamerip/rygqatae/descent.mp3',
  'https://ia801405.us.archive.org/6/items/total-distortion-bgm-bedroom/Total%20Distortion%20-%20BGM%20%28Approach%20the%20Pod%29.mp3',
  'https://ia601405.us.archive.org/6/items/total-distortion-bgm-bedroom/Total%20Distortion%20-%20BGM%20%28Bedroom%29.mp3',
  'https://ia801405.us.archive.org/6/items/total-distortion-bgm-bedroom/Total%20Distortion%20-%20BGM%20%28Media%20Room%29.mp3',
  'https://ia801405.us.archive.org/6/items/total-distortion-bgm-bedroom/Total%20Distortion%20-%20BGM%20%28Settings%29.mp3',
  'https://vgmsite.com/soundtracks/super-mario-rpg-1996-snes/jojhnpopmv/1-19%20-%20Fight%20Against%20an%20Armed%20Boss.mp3',
  'https://vgmsite.com/soundtracks/duke-nukem-3d/cqddfvjn/01%20grabbag%20~%20theme%20from%20duke%20nukem%203d.mp3',
  'https://vgmsite.com/soundtracks/007-goldeneye-64/piaypemc/1-03%20Mission%20Briefing.mp3',
  'https://vgmsite.com/soundtracks/deus-ex-original-game-audio/txloomvd/085%20unatco%20%28part%201%29.mp3',
  'https://vgmsite.com/soundtracks/deus-ex-original-game-audio/vypjdfaj/086%20unatco%20%28part%202%29.mp3',
  'https://vgmsite.com/soundtracks/deus-ex-original-game-audio/jymdbqtk/002%20title%20-%20deus%20ex.mp3',
  'https://vgmsite.com/soundtracks/super-hockey-94-snes/ygjvodrkil/02%20Menu.mp3',
  'https://vgmsite.com/soundtracks/super-hockey-94-snes/fkdbtzksdx/03%20Game%20Match%201.mp3',
  'https://vgmsite.com/soundtracks/perfect-dark-64/lcwnkvyrso/2-07%20Pause%20Menu.mp3'

]);

</script>

Привет, было бы полезно иметь воспроизводимый пример. не могли бы вы включить ссылки, из-за которых он перестает работать?

tom 23.02.2023 10:48

Мы говорим об аудиофайлах, которые вы размещаете на своем собственном сервере, или вы просто вводите абсолютный URL-адрес файлов на удаленных серверах, которые даже не находятся под вашим контролем?

CBroe 23.02.2023 10:50

Я обновил пост.

Antique Chair 23.02.2023 11:00

Вопрос пока не ясен. Вы говорите, что он снова начинает работать, когда вы удаляете некоторые из этих URL-адресов ... хорошо, вы пытались понять, что не так с этими URL-адресами? каким образом это не работает, когда это не так? вы просто не слышите музыку или у вас явные ошибки в консоли? с кодом, которым вы поделились, трудно справиться еще и потому, что он опирается на не перечисленные переменные во внешней области. Но поскольку проблема зависит от некоторых URL-адресов, которые после удаления из списка решают проблему ... ну, здесь недостаточно информации

Diego D 23.02.2023 11:11

Я согласен с Диего Д. пожалуйста, сделайте фрагмент кода выше воспроизводимым. поэтому, когда мы запускаем его, он вызывает ту же ошибку, что и вы.

tom 23.02.2023 11:12

Хорошо, тогда я опубликую весь фрагмент кода (я также могу просто дать вам ссылку на сам сайт)

Antique Chair 23.02.2023 11:15

Хорошо, я добавил весь сценарий.

Antique Chair 23.02.2023 11:32
Оптимизация React Context шаг за шагом в 4 примерах
Оптимизация React Context шаг за шагом в 4 примерах
При использовании компонентов React в сочетании с Context вы можете оптимизировать рендеринг, обернув ваш компонент React в React.memo сразу после...
Интервьюер: Почему &apos;[] instanceof Object&apos; возвращает &quot;true&quot;?
Интервьюер: Почему '[] instanceof Object' возвращает "true"?
Все мы знаем, что [] instanceof Array возвращает true, но почему [] instanceof Object тоже возвращает true?
Абстрактное синтаксическое дерево (AST) и как оно работает с ReactJS
Абстрактное синтаксическое дерево (AST) и как оно работает с ReactJS
Абстрактное синтаксическое дерево (AST) - это древовидная структура данных, которая представляет структуру и иерархию исходного кода на языке...
2
7
53
1
Перейти к ответу Данный вопрос помечен как решенный

Ответы 1

Ответ принят как подходящий

4 ссылки не работают.

Скрипт никогда не запускается, потому что он хочет, чтобы все ссылки/аудио работали в этой строке:

If (collection.length==loadedIndex)playLooped();

Функция буфера проверяет, загружен ли каждый аудиофайл в буфер браузера, ждет 100 мс, а затем повторяет попытку, пока звук не достигнет readyState 4. нет никакой логики, определяющей, когда песня не может быть загружена. поэтому он продолжает пытаться вечно, и вышеуказанное условие никогда не выполняется.

Я изменил ваш фрагмент на stackblitz. вы можете попробовать его там и поиграть с ним.

Моя модифицированная версия не пуленепробиваемая. это просто показать вам, что не так. он пытается 300 раз буферизовать песню. если это невозможно, он удаляет песню из массива collection и сообщает функции loading не увеличивать индекс.

Это означает

  • что функция buffer ждет 300 * 100 мс для каждой песни, которую она не может загрузить, например, сценарий начнет воспроизводиться через 30 с, если есть хотя бы одна песня, которая медленно буферизуется / не найдена
  • maxRetries зависит от интернет-соединения пользователя, он не знает, требуется ли много времени для буферизации песни, пока она не будет готова к воспроизведению, или если URL-адрес песни не существует.
var collection = [];
var loadedIndex = 0;
var retries = {};
var maxRetries = 300;

function init(audios) {
  for (var i = 0; i < audios.length; i++) {
    var audio = new Audio(audios[i]);
    collection.push(audio);
    retries[audio.src] = 0;
    buffer(audio);
  }
}

function buffer(audio) {
  retries[audio.src]++;
  if (retries[audio.src] > maxRetries) {
    var idxInvalidAudio = collection.findIndex((el) => el === audio);
    console.error(`${collection[idxInvalidAudio].src} cannot be loaded`);
    collection.splice(idxInvalidAudio, 1);
    return loaded(false);
  }
  if (audio.readyState == 4) {
    return loaded(true);
  }
  setTimeout(function () {
    buffer(audio);
  }, 100);
}

function loaded(incrementFlag) {
  if (incrementFlag) {
    loadedIndex++;
  }

  if (collection.length == loadedIndex) {
    playLooped();
  }
}

function playLooped() {
  var audio = Math.floor(Math.random() * collection.length);
  audio = collection[audio];
  audio.play();
  setTimeout(playLooped, audio.duration * 1000);
}

init([
 // urls...
])

Кстати: мне очень нравится ваш тщательно подобранный список мелодий ;)

Почему бы вам не добавить код прямо в ответ?

DarkBee 23.02.2023 12:32

Это сделало трюк! Мои поздравления, милостивый государь! Спасибо, что объяснили это тоже, я собирался об этой проблеме в течение почти месяца. "Кстати: мне очень нравится твой тщательно подобранный список мелодий ;)" Приятно слышать. Мой сайт находится по адресу antichair.neocities.org (Просто следуйте инструкциям по настройке вида и наслаждайтесь!)

Antique Chair 23.02.2023 13:48

@darkbee, ты прав. я изменил фрагмент. теперь я отслеживаю количество повторных попыток в глобальной переменной, а не рекурсивно, как раньше.

tom 23.02.2023 14:17

Другие вопросы по теме