AudioBuffer - 仅从特定长度的特定样本获取数据而不解码整个声音
AudioBuffer - get data only from a particular sample of a particular length without decoding the entire sound
我正在 JavaScript 开发 DAW,我需要能够加载许多(最多 30 个)长音频文件(每个最多 15 分钟),但我不希望它们加载淹没记忆。我只想能够切割小块,处理它们并混合 ScriptProcessorNode
,但我遇到了几个问题:
- AudioBuffer 会将整个音频文件加载到内存中未压缩
- AudioBuffer.getChannelData() 将提取 整个 缓冲区 - 不可能只提取一小块(例如,从样本 1024 到样本 2048)
- MediaElementAudioSourceNode,用于处理大文件 - 它不会让我从中提取任何数据,也不会让我从 URL 动态加载文件 - 它只允许我连接到AudioContext 中的其他节点,但我不想在任何地方连接它
有没有办法加载大的音频文件,例如 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 库是使用这种技术构建的。
我正在 JavaScript 开发 DAW,我需要能够加载许多(最多 30 个)长音频文件(每个最多 15 分钟),但我不希望它们加载淹没记忆。我只想能够切割小块,处理它们并混合 ScriptProcessorNode
,但我遇到了几个问题:
- AudioBuffer 会将整个音频文件加载到内存中未压缩
- AudioBuffer.getChannelData() 将提取 整个 缓冲区 - 不可能只提取一小块(例如,从样本 1024 到样本 2048)
- MediaElementAudioSourceNode,用于处理大文件 - 它不会让我从中提取任何数据,也不会让我从 URL 动态加载文件 - 它只允许我连接到AudioContext 中的其他节点,但我不想在任何地方连接它
有没有办法加载大的音频文件,例如 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 库是使用这种技术构建的。