我正在使用 wavesurfer.js 在线创建多轨播放器,并希望导出带有水平平移等的组合轨道的混音版本。
首先,我有一个 audioFiles 数组,并使用它来创建一个 wavesurfer 元素数组。
for(var i=0; i<audiofiles.length; i++){
spectrum[i] = WaveSurfer.create({
});
}
然后我从 wavesurfer 后端为每一个创建一个缓冲区
for(var i=0; i<audiofiles.length; i++){
var ctx = spectrum[i].backend.ac;
var length = spectrum[i].getDuration() * sample_rate * 2;
var ctx_buffer = ctx.createBuffer(2, length, ctx.sampleRate);
// pass raw pcm buffer to download function
}
最后我在这里得到了一些关于下载功能的帮助从 web 下载已用 wavesurfer.js 修改的音频
此时我的问题是,我传递给下载功能的内容似乎格式不正确。我是使用音频的新手,不确定自己在做什么。
如果我将 ctx_buffer 变量传递给另一个问题中的函数(并使用它而不是直接从 pcm 文件获得的缓冲区变量),我将成功下载,但文件为空,尽管它是正确的长度(在上面的长度中省略 *2 将有一个空文件,正好是我原来长度的一半)。
这里的 wavesurfer.js 中有一个 exportPCM() 函数https://wavesurfer-js.org/docs/methods.html但我也不确定它是如何工作的。
编辑
buttons.save_all.addEventListener("click", function(){
document.getElementById("download_icon").className = "fas fa-spinner loader";
document.getElementById("download_text").innerText = "Loading...";
var length = spectrum[0].getDuration()*44100*2;
for(var i=0; i<audiofiles.length; i++){
var ctx = spectrum[i].backend.ac;
var sample_rate = ctx.sampleRate;
var length = spectrum[i].getDuration()*sample_rate*2;
var ctx_buffer = ctx.createBuffer(2, length, ctx.sampleRate);
download_init(ctx_buffer,length,sample_rate).catch(showError);
}
}, false);
function showError(e) {
console.log(`ERROR: ${e}`);
}
var x = 0;
async function download_init(ctx_buffer,length,sample_rate) {
// const buffer = await (await fetch(url)).arrayBuffer()
const wavBytes = getWavBytes(ctx_buffer, {
numFrames: ctx_buffer.length,
numChannels: 1,
sampleRate: sample_rate,
isFloat: false
});
console.log(wavBytes);
blobs[x] = URL.createObjectURL(
new Blob([wavBytes], { type: 'audio/wav' })
)
document.getElementById("btn_download").href = blobs[0];
document.getElementById("btn_download").setAttribute('download', 'download.wav');
document.getElementById("btn_save_all").hidden = true;
document.getElementById("btn_download").hidden = false;
x++;
}