使用JS获取mp3文件频率数据

3

在播放mp3之前,有没有一种方法可以获取mp3数据(其频率)? 请注意,我不需要全部获取它的数据 - 如果我可以得到5秒“未来”帧的框架数据,那就足够了(即尚未播放的帧数据)。 同时,我需要这个方法能在客户端/浏览器端实现,而不是在服务器端。是否有此类方法可以实现?

2个回答

3

正如你所提到的,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));
        }
    });

3

您不必将音频数据从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);

然后,您可以在两个具有不同时间戳的相同音频文件上运行此代码,并保存来自无声文件的数据。

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接