AudioBuffer - 仅从特定长度的特定样本获取数据而不解码整个声音

AudioBuffer - get data only from a particular sample of a particular length without decoding the entire sound

我正在 JavaScript 开发 DAW,我需要能够加载许多(最多 30 个)长音频文件(每个最多 15 分钟),但我不希望它们加载淹没记忆。我只想能够切割小块,处理它们并混合 ScriptProcessorNode,但我遇到了几个问题:

有没有办法加载大的音频文件,例如 MP3 格式的文件,将它们压缩为 MP3 格式 保存在内存中,但将小块音频数据提取到音频缓冲区?

喜欢,例如:

var request = new XMLHttpRequest();
request.open('GET', 'my_15min_audioFile.ogg', true);
request.responseType = 'arraybuffer';
request.onload = function() {
    var longCompressed = new LongAudioNode(request.response);// something similar to fs.open
    var channel=1, fromSample=1024, length=2048;
    var block/**Float32Array*/ = longCompressed.extractBlock(channel, fromSample, length);/// similar to fs.read
    /// do something with this block and then request another from any random index I want
}
request.send();

浏览器中没有 API 完全符合您的要求。但将来可能会有一个。 Web Codecs 可能会支持以流的形式读取解码数据。

但是有一个在特定条件下有效的解决方法。您可以使用 MP3 的编码数据扫描 ArrayBuffer 以查找帧头,然后相应地对其进行剪切。这些片段应该仍然是有效的 MP3,然后可以用 decodeAudioData() 解码。但是有一些问题。如果没有任何 post 处理,解码的片段可能无法组合在一起。 phonograph 库是使用这种技术构建的。