2017-01-13 4 views
0

Я знаю, что это было задано раньше, но я новичок в JavaScript и, прочитав другие ответы, не могу понять, почему мой метод не работает. Первый трек, который воспроизводится, случайный, но затем, когда песня заканчивается, один и тот же трек повторяется снова и снова, вместо того, чтобы выбирать другую случайную дорожку. Если audio.play выбирает случайный трек в первый раз, почему он не выбирает случайную дорожку снова, когда песня заканчивается, а вместо этого пеет один и тот же трек? Помощь оценили:Случайный, случайный плейлист JavaScript JavaScript

var audio_files = [ 
"TRACKS/1.mp3", 
"TRACKS/2.mp3", 
"TRACKS/3.mp3" 
] 

var random_file = audio_files[Math.floor(Math.random() * audio_files.length)]; 

var audio = new Audio(random_file); 

audio.play(); 

audio.addEventListener('ended', function(){ 
audio.play(); 
} 
+1

Вы только выбрали случайный файл один раз. –

+0

Любое предложение для простейшего способа снова выбрать случайный файл при завершении песни? – Tom

+0

У вас есть цикл, когда выбран случайный файл? Или это единственная операция? – VadimB

ответ

0

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

Как только вы дойдете до конца, сделайте то же самое, перетасуйте массив и повторите снова. Таким образом, список изменится, показывая впечатление на выбор другого файла случайным образом (но поистине просто повторяя).

Вот псевдокод ему

function readFiles(){   
    array = shuffle(array); 
    for(var i = 0; i < array.length; ++i){ 
     play(array[i]); 
    } 
    readFiles(); //to read undefinitly 
} 

Here и here, вы найдете большие темы, перетасовать массив. Я не буду делать это снова, просто следуйте за ним.

В вашем случае, вы не хотите петлю, но вы будете использовать счетчик будет получить следующий файл и перетасовать массив снова, как только вы дойдете до конца

function getNextFile(){ 
    if(currentFile >= array.length){ //reach the end 
     shuffle(array); 
     currentFile = 0; 
    } 
    return array[currentFile+]; 
} 
+0

Спасибо, я использовал эту информацию в сочетании с функцией addListenerEvent ('finished'), чтобы перетасовать массив второй раз; новая проблема заключается в том, что между треками, которые мне нужно устранить или перетащить, есть небольшие паузы, чтобы сделать приятную музыку ... – Tom

+0

@tom Где это? Итерация, игрок, сам файл? Решение зависит от источника. – AxelH

+0

Я нашел работоспособное решение, получив следующий трек за полсекунды раньше, хотя я думаю, что переключусь на API веб-аудио, как только я пойму, что JavaScript немного лучше. Новая проблема: каждый раз, когда я загружаю страницу, перетасованный массив начинается с того, что было # 1 в массиве. После этого треки «random», но первый трек, когда я загружаю страницу, всегда # 1 в массиве: поэтому массив может быть [1, 4, 9, 12] или [1, 9, 12, 4 ] и т. д., но 1 всегда # 1. Есть идеи? Я начну новый поток, чтобы опубликовать код, если это лучше. – Tom

0

Ваш код должен выглядеть так:

var audio_files = [ 
"TRACKS/1.mp3", 
"TRACKS/2.mp3", 
"TRACKS/3.mp3" 
] 

function random_file(){ 
    return audio_files[Math.floor(Math.random() * audio_files.length)]; 
} 

var audio = new Audio(random_file()); 

audio.play(); 

audio.addEventListener('ended', function(){ 
    audio.play(random_file()); 
} 

Ваш у слушателя может быть, как это, если игрок имеет другой способ указать файл для существующего плательщика

audio.addEventListener('ended', function(){ 
    audio.src = random_file(); 
    audio.play(); 
} 

или если у вашего плеера нет такого метода api, единственный способ -

function listner() { 
    audio = new Audio(random_file()); 
    audio.play(); 
    audio.addEventListener('ended', listner) 
} 

audio.addEventListener('ended', listner) 
+0

В дикой природе был доказан следующий способ генерации случайного файла: 'Math.floor (Math.random() * (max - min + 1)) + min;'. См. Также http://stackoverflow.com/documentation/javascript/203/arithmetic-math#t=201701131054542553563. – reporter

+0

Где 'min = 0 max = (audio_files.length-1)' then: 'Math.floor (Math.random() * ((audio_files.length-1) -0 + 1)) + 0', что равно:' Math.floor (Math.random() * audio_files.length) ' – oklas

+0

В вашем примере это будет так же. В случае, если значение min отличается от нуля, то больше нет. – reporter

0

Просто установите знаменитый модуль underscoreJS на стороне клиента или сервера с помощью Node.js и вызовите функцию образца;

var random_file = _.sample(audio_files); 
+0

Как это помогает решить проблему игры в случайном порядке в бесконечное время? – oklas

+0

Да - то, что я хочу, это плейлист, который будет продолжаться и продолжаться вечно, выбирая новую дорожку в конце каждого трека, чтобы я мог создать некую мелодию, которая продолжается и продолжается вечно ... Может быть, тоже амбициозный для моего второго дня с помощью JavaScript/code ... – Tom

+0

@ Томальная вещь всегда должна точно знать, какие отдельные шаги необходимы для создания всей картины. – reporter

Смежные вопросы