用js获取mp3文件频率数据
Getting mp3 file frequency data with js
有没有办法在播放之前获取 mp3 数据(其频率)?请注意,我不必全部了解 - 如果我能得到它就足以给我“进入未来”(尚未播放的帧)5 秒的帧数据。
我还需要它是 client/browser-side,而不是服务器端。
有办法吗?
正如您已经提到的,作为网络音频 API 的一部分的 AnalyzerNode
用于实时使用。
因此我建议在离线场景下使用Meyda. Meyda itself relies on fftjs
来计算频谱。
这是一个小片段,它记录了 512 个样本的每个块的 amplitudespectrum,在 mp3 的前 5 秒内没有任何重叠。
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);
然后你可以运行在两个相同的音频文件上使用这段代码,每个文件都有不同的时间戳,并保存静音文件的数据。
有没有办法在播放之前获取 mp3 数据(其频率)?请注意,我不必全部了解 - 如果我能得到它就足以给我“进入未来”(尚未播放的帧)5 秒的帧数据。 我还需要它是 client/browser-side,而不是服务器端。 有办法吗?
正如您已经提到的,作为网络音频 API 的一部分的 AnalyzerNode
用于实时使用。
因此我建议在离线场景下使用Meyda. Meyda itself relies on fftjs
来计算频谱。
这是一个小片段,它记录了 512 个样本的每个块的 amplitudespectrum,在 mp3 的前 5 秒内没有任何重叠。
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);
然后你可以运行在两个相同的音频文件上使用这段代码,每个文件都有不同的时间戳,并保存静音文件的数据。