2016-07-03 15 views
0

遅延を50msまたは100msで再生する最善の方法は何ですか?ここ は、私が試したものを何か、次のとおりです。遅延(100ms)のサウンドを再生しますか?

var beat = new Audio('/sound/BEAT.wav'); 
var time = 300; 
playbeats(); 
function playbeats(){ 
    beat.cloneNode().play(); 
    setTimeout(playbeats, time); 
} 

これが正常に機能しているが、私の目標は、すべての100msの後BEAT.wavを再生することです。 "time"変数を100に変更すると、それはとても遅いです。
721msは私のBEAT.wavです(なぜcloneNode()を使用しているのですか)

これを解決するにはどうすればよいですか?

+0

_ "遅い"とはどういう意味ですか? – guest271314

+0

あなたのBEAT.wavはどれくらい持続するのですか?あなたはそれへのリンクを共有できますか? – Arnauld

+0

100ms後に毎回サウンドを再生する必要があります(タイムアウトarg 2を100に設定すると)が、ビート間に約30ms〜100msあります。 – Chalic

答えて

1

setInterval()を使用できます。引数は同じです。

setInterval(function() { 
    playbeats(); 
}, 100); 

であり、あなたの関数playbeats関数は以下のとおりです。

function playbeats(){ 
var tempBeat=beat.cloneNode(); 
tempBeat.play(); 

}

あなたの全体のプログラムは、このようにする必要があります。

var beat = new Audio('/sound/BEAT.wav'); 
    setInterval(function() { 
    playbeats(); 
    }, 100); 

function playbeats(){ 
var tempBeat=beat.cloneNode(); 
tempBeat.play(); 

    } 
+0

'.cloneNode()'を使う目的は何ですか? – guest271314

+0

cloneNode()メソッドは、ノードのコピーを作成し、その複製を返します。 –

+0

はい、なぜオーディオ再生のループの期待される結果を返すために '.cloneNode()'を使う必要がありますか? – guest271314

0

あなたはウェブオーディオAPIを使用することができますが、コードは、あなたが最初のバッファにファイルをロードする必要がありますウェブオーディオAPIのタイミングおよびループcapabillitiesをしたいdifferent.Ifビットになります。また、コードをサーバー上で実行する必要があります。次に例を示します。

var audioContext = new AudioContext(); 
var audioBuffer; 
var getSound = new XMLHttpRequest(); 
getSound.open("get", "sound/BEAT.wav", true); 
getSound.responseType = "arraybuffer"; 

getSound.onload = function() { 
    audioContext.decodeAudioData(getSound.response, function(buffer) { 
     audioBuffer = buffer; 
    }); 
}; 

getSound.send(); 


function playback() { 
    var playSound = audioContext.createBufferSource(); 
    playSound.buffer = audioBuffer; 
    playSound.loop = true; 
    playSound.connect(audioContext.destination); 
    playSound.start(audioContext.currentTime, 0, 0.3); 
} 
window.addEventListener("mousedown", playback); 
+0

私はクライアント側で(私のコードはクライアント側で実行する必要があります)私はそれを行う必要があるときにも選択肢がありますか? – Chalic

+0

コードはクライアント側を実行するだけで、サーバから実行する必要があります。 – William

+0

オーディオファイルを明確にするには、実行中のサーバーから参照する必要がありますが、コード自体はクライアント側です。 – William

0

Web Audio APIの使用をおすすめします。そこから、バッファ・ソース・ノードを100msまたは50msごとに、または任意の時間にループすることができます。他の回答で述べたように がこれを行うには、あなたは今すぐ

// set up the Web Audio context 
var audioCtx = new AudioContext(); 

// create a new buffer 
// 2 channels, 4410 samples (100 ms at 44100 samples/sec), 44100 samples per sec 
var buffer = audioCtx.createBuffer(2, 4410, 44100); 

// load the sound file via an XMLHttpRequest from a server 
var request = new XMLHttpRequest(); 
request.open('GET', '/sound/BEAT.wav', true); 
request.responseType = 'arraybuffer'; 

request.onload = function() { 
    var audioData = request.response; 

    audioCtx.decodeAudioData(audioData, function (newBuffer) { 
     buffer = newBuffer; 
    }); 
} 

request.send(); 

あなたが再生

// create the buffer source 
var bufferSource = audioCtx.createBufferSource(); 

// set the buffer we want to use 
bufferSource.buffer = buffer; 

// set the buffer source node to loop 
bufferSource.loop = true; 

// specify the loop points in seconds (0.1s = 100ms) 
// this is a little redundant since we already set our buffer to be 100ms 
// so by default it would loop when the buffer comes to an end (at 100ms) 
bufferSource.loopStart = 0; 
bufferSource.loopEnd = 0.1; 

// connect the buffer source to the Web Audio sound output 
bufferSource.connect(audioCtx.destination); 

// play! 
bufferSource.start(); 
ループにバッファソースノードを作ることができ、サーバを経由して、サウンドファイルをロードするためにXMLHttpRequestを使用する必要があります

bufferSource.stop()で再生を停止すると、もう一度再生を開始できません。 start()に一度しか電話することはできませんので、もう一度再生を開始するには、新しいソースノードを作成する必要があります。

XMLHttpRequestを介してサウンドファイルがロードされるため、サーバーを実行しないでマシンでこれをテストしようとすると、ほとんどのブラウザで相互参照要求エラーが発生することに注意してください。だから、マシン上でこれをテストしたい場合、これを回避する最も簡単な方法は、Python SimpleHTTPServerを実行することです。

関連する問題