2017-01-13 4 views
0

Ich weiß, dass dies schon einmal gefragt wurde, aber ich bin neu in JavaScript und nach dem Lesen anderer Antworten kann ich nicht verstehen, warum meine Methode nicht funktioniert. Der erste Track, der abgespielt wird, ist zufällig, aber wenn der Song endet, wiederholt sich derselbe Track immer wieder, anstatt einen anderen zufälligen Track zu wählen. Wenn audio.play beim ersten Mal eine zufällige Spur auswählt, warum wählt es nicht erneut eine zufällige Spur, wenn das Lied endet, sondern stattdessen die gleiche Spur? Hilfe zu schätzen:Random, Shuffle JavaScript-Playlist

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

Sie sind nur eine zufällige Auswahl Datei einmal. –

+0

Irgendwelche Vorschläge für den einfachsten Weg, eine zufällige Datei bei der Fertigstellung des Songs erneut auszuwählen? – Tom

+0

Haben Sie einen Zyklus, wenn Ihre zufällige Datei ausgewählt wurde? Oder es ist Einzeloperation? – VadimB

Antwort

0

Es wäre einfacher, das Array zu mischen und einfach darauf zu iterieren, um jede Datei zu erhalten. Mit dieser Lösung erhalten Sie aufgrund der zufälligen Lösung nicht die gleiche Datei zweimal.

Sobald Sie am Ende angekommen sind, machen Sie das Gleiche, mischen Sie das Array und wiederholen Sie es. Auf diese Weise ändert sich die Liste, was den Eindruck erweckt, eine andere Datei auf zufällige Weise auszuwählen (aber wirklich einfach zu iterieren).

Hier ist ein Pseudo-Code, um es

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

Here und here, finden Sie ein großen Themen finden das Array zu mischen. Ich werde es nicht noch einmal tun, folge einfach der Antwort dort.

In Ihrem Fall Sie keine Schleife wollen, aber Sie werden einen Zähler das bekommen die nächste Datei verwenden und das Array mischen wieder, wenn Sie bis zum Ende erhalten

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

Danke, ich habe diese Information kombiniert mit einer addListenerEvent ('ended') Funktion benutzt, um das Array ein zweites Mal zu mischen; Das neue Problem ist, dass es zwischen den Tracks leichte Pausen gibt, die ich eliminieren oder überblenden muss, um eine angenehme Musik zu machen ... – Tom

+0

@tom Woher kommt es? Die Iteration, der Spieler, die Datei selbst? Abhängig von der Quelle existiert eine Lösung. – AxelH

+0

Ich fand eine praktikable Lösung, indem ich den nächsten Track eine halbe Sekunde früher starten lasse, obwohl ich denke, dass ich zur Web Audio API wechseln werde, sobald ich JavaScript ein bisschen besser verstehe. Das neue Problem: Jedes Mal, wenn ich die Seite lade, beginnt das gemischte Array mit der Nummer 1 im Array. Danach sind die Spuren "zufällig", aber die erste Spur, wenn ich die Seite lade, ist immer # 1 im Array: also könnte das Array [1, 4, 9, 12] oder [1, 9, 12, 4] sein ] usw., aber 1 ist immer # 1. Irgendwelche Ideen? Ich werde einen neuen Thread starten, um den Code zu posten, wenn das besser ist. – Tom

0

Ihr Code wie folgt sein müssen:

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()); 
} 

Ihre listner kann so sein, wenn der Spieler eine andere Weise Datei angeben, für bestehende Zahler

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

oder Wenn Ihr Player keine solche API-Methode hat, ist der einzige Weg

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

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

In der freien Wildbahn wurde der folgende Weg zum Erzeugen einer Zufallsdatei bewiesen: 'Math.floor (Math.random() * (max - min + 1)) + min;'. Siehe auch http://stackoverflow.com/documentation/javascript/203/arithmetic-math#t=201701131054542553563. – reporter

+0

Wobei 'min = 0 max = (audio_files.length-1)' dann: 'Math.floor (Math.random() * ((audio_files.length-1) -0 + 1)) + 0' das ist gleich:' Math.floor (Math.random() * audio_files.length) ' – oklas

+0

In Ihrem Beispiel wird es gleich sein. Im Fall, der min Wert ist anders als Null dann nicht mehr. – reporter

0

Installieren Sie einfach das bekannte undercoreJS-Modul auf Client- oder Serverseite mit Node.js und rufen Sie die Beispielfunktion auf;

+0

Wie es hilft, das Problem des Spiels in zufälliger Reihenfolge in unendlicher Zeit zu lösen? – oklas

+0

Ja - was ich will, ist eine Playlist, die für immer weiter geht und am Ende jedes Tracks einen neuen zufälligen Track auswählt, damit ich eine Art Melodie kreieren kann, die für immer und ewig weiterläuft ... Vielleicht auch Ehrgeizig für meinen zweiten Tag mit JavaScript/code ... – Tom

+0

@Tom die erste Sache ist immer genau zu wissen, wessen einzelne Schritte nassecary sind, um das ganze Bild zu erstellen. – reporter