我需要分层循环 .wav 轨道,最终我需要能够打开和关闭并保持同步。
首先,我加载轨道并停止BufferLoader
将加载的轨道arraybuffer
变成AudioBuffer
(因此false
)
function loadTracks(data) {
for (var i = 0; i < data.length; i++) {
trackUrls.push(data[i]['url']);
};
bufferLoader = new BufferLoader(context, trackUrls, finishedLoading);
bufferLoader.load(false);
return loaderDefered.promise;
}
当您单击屏幕上的按钮时,它会调用startStop()
.
function startStop(index, name, isPlaying) {
if(!activeBuffer) {
activeBuffer = bufferList[index];
}else{
activeBuffer = appendBuffer(activeBuffer, bufferList[index]);
}
context.decodeAudioData(activeBuffer, function(buffer){
audioBuffer = buffer;
play();
})
function play() {
var scheduledTime = 0.015;
try {
audioSource.stop(scheduledTime);
} catch (e) {}
audioSource = context.createBufferSource();
audioSource.buffer = audioBuffer;
audioSource.loop = true;
audioSource.connect(context.destination);
var currentTime = context.currentTime + 0.010 || 0;
audioSource.start(scheduledTime - 0.005, currentTime, audioBuffer.duration - currentTime);
audioSource.playbackRate.value = 1;
}
我在这个家伙 github 上找到的大部分代码。在演示中,您可以听到他正在对 AudioBuffers 进行分层。
我在主机上尝试过同样的方法。
不管这些argularJS
东西,网络音频的东西正在发生service.js
在:
/js/angular/service.js
如果您打开控制台并单击按钮,您可以看到activeBuffer.byteLength
(ArrayBuffer 类型)正在递增,但是即使在通过该context.decodeAudioData
方法解码后,它仍然只播放您单击的第一个声音,而不是合并的声音AudioBuffer