2017-01-13 2 views
0

私はこれまでに尋ねられたことは知っていますが、私はJavaScriptを初めて使っており、他の回答を読んだ後に私の方法がうまくいかない理由を具体的に理解できません。最初に再生されるトラックはランダムですが、曲が終了すると、別のランダムトラックを選択するのではなく、同じトラックが繰り返し再生されます。もしaudio.playが最初にランダムなトラックを選んだのであれば、曲が終わるとランダムなトラックを選ぶのではなく、同じトラックをループさせるのはなぜですか?ランダム、シャッフル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

アレイをシャッフルして、各ファイルを取得するために単純に繰り返します。このソリューションでは、ランダムなソリューションのために同じファイルを2回取得することはありません。

終了したら、同じことを行い、配列をシャッフルしてもう一度繰り返します。このように、リストが変更され、ランダムな方法で別のファイルを選択するという印象を与えます(しかし、本当に単純に繰り返します)。ここで

はそれ

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

Herehereに擬似コードである、あなたは偉大なスレッドは、配列をシャッフルするでしょう。私はもう一度やりません。ちょうどその答えに従ってください。あなたのケースでは

は、あなたがループしたくないけど、あなたはあなたが唯一のランダムに選択している

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

ありがとう、私はこの情報をaddListenerEvent( 'ended')関数と組み合わせて2回目の配列をシャッフルします。新しい問題は楽しい音楽を作るために私が排除するかクロスフェードする必要があるトラックの間にわずかな休止があるということです。 – Tom

+0

@tomどこから来たのですか?繰り返し、プレーヤー、ファイル自体?ソースに応じて、解決策が存在します。 – AxelH

+0

私はJavaScriptをもう少しよく理解すれば、私はWeb Audio APIに切り替えるつもりだと思いますが、次のトラックを半分早く始めることで実行可能な解決策を見つけました。 新しい問題:ページを読み込むたびに、シャッフルされた配列は配列内の#1で始まります。その後、トラックは「ランダム」ですが、ページをロードするときの最初のトラックは常に配列内の#1です。したがって、配列は[1,4,9,12]または[1,9,12,4 ]などですが、1は常に#1です。何か案は?より良いコードを投稿するために新しいスレッドを開始します。 – Tom

0

あなたのコードを次のようにする必要があります:プレイヤーは、既存の支払人のために

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

をファイルを指定する別の方法を持っている場合

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

あなたのリスナーはこのようであってもよいし、感謝のヘルププレイヤーにそのような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)'となると、 'Math.floor(Math.random()*((audio_files.length-1)-0 + 1))+ Math.floor(Math.random()* audio_files.length) ' – oklas

+0

あなたの例では同じです。その場合、最小値はゼロとは異なり、もはやゼロではありません。 – reporter

0

有名なunderscoreJSモジュールをNode.jsを使用してクライアント側またはサーバー側にインストールし、サンプル関数を呼び出すだけです。

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

無限の時間内にランダムな順序で遊びの問題を解決する方法は? – oklas

+0

はい - 私が望むのは永遠に続くプレイリストです。各トラックの終わりに新しいランダムなトラックを選んで、永遠に続くような種類のメロディーを作り出すことができます...多分あまりにもJavaScript /コードで私の2日目に野心的です... – Tom

+0

@Tom拳のことは、誰の単一のステップが全体の画像を作成するナセカリーであるかを常に知ることです。 – reporter