在播放mp3之前,有没有一种方法可以获取mp3数据(其频率)? 请注意,我不需要全部获取它的数据 - 如果我可以得到5秒“未来”帧的框架数据,那就足够了(即尚未播放的帧数据)。 同时,我需要这个方法能在客户端/浏览器端实现,而不是在服务器端。是否有此类方法可以实现?
在播放mp3之前,有没有一种方法可以获取mp3数据(其频率)? 请注意,我不需要全部获取它的数据 - 如果我可以得到5秒“未来”帧的框架数据,那就足够了(即尚未播放的帧数据)。 同时,我需要这个方法能在客户端/浏览器端实现,而不是在服务器端。是否有此类方法可以实现?
正如你所提到的,Web Audio API 中的 AnalyzerNode
适用于实时使用。
因此,我建议使用 Meyda。Meyda 本身依赖于 fftjs
以便在离线场景下计算频谱。
这里有一个小片段,它会在 mp3 文件的前五秒内,每个包含 512 个样本且没有重叠的块中记录 振幅谱。
const Meyda = require('meyda');
fetch('/my.mp3')
.then((response) => response.arrayBuffer())
.then((arrayBuffer) => {
// It's of course also possible to re-use an existing
// AudioContext to decode the mp3 instead of creating
// a new one here.
offlineAudioContext = new OfflineAudioContext({
length: 1,
sampleRate: 44100
});
return offlineAudioContext.decodeAudioData(arrayBuffer);
})
.then((audioBuffer) => {
const signal = new Float32Array(512);
for (let i = 0; i < audioBuffer.sampleRate * 5; i += 512) {
audioBuffer.copyFromChannel(signal, 0, i);
console.log(Meyda.extract('amplitudeSpectrum', signal));
}
});
您不必将音频数据从WebAudioAPI流式传输到输出源。
这是他们通常在教程中使用的节点网络:
context = new AudioContext();
src = context.createMediaElementSource(source);
analyser = context.createAnalyser();
var listen = context.createGain();
src.connect(listen);
listen.connect(analyser);
analyser.connect(context.destination);
如果你断开了context.destination
,你应该能获取到数据,但是是静音的。像下面这样的代码:
context = new AudioContext();
src = context.createMediaElementSource(source);
analyser = context.createAnalyser();
var listen = context.createGain();
src.connect(listen);
listen.connect(analyser);