我需要对.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
部分,Web Audio 的内容在 service.js
中进行:
/js/angular/service.js
如果您打开控制台并点击按钮,您可以看到 activeBuffer.byteLength
(类型为ArrayBuffer)正在增加,但是即使通过context.decodeAudioData
方法进行解码,它仍然只播放您单击的第一个声音而不是合并的AudioBuffer
data.set(buffer1.getChannelData(i)); data.set(buffer2.getChannelData(i),buffer1.length);
来追加两个缓冲区。如果我们想要合并它们,以便同时播放,该怎么办呢? - AbsarAkram