用js获取mp3文件频率数据

Posted

技术标签:

【中文标题】用js获取mp3文件频率数据【英文标题】:Getting mp3 file frequency data with js 【发布时间】:2021-03-07 09:21:23 【问题描述】:

有没有办法在播放前获取 mp3 数据(其频率)?请注意,我不必全部获得它 - 如果我能获得它来给我“未来”5 秒的帧数据(尚未播放的帧)就足够了。 我还需要它是客户端/浏览器端,而不是服务器端。 有没有办法做到这一点?

【问题讨论】:

【参考方案1】:

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

然后您可以在两个相同的音频文件上运行此代码,每个文件都有不同的时间戳,并保存静音文件中的数据。

【讨论】:

【参考方案2】:

正如您已经提到的,作为 Web 音频 API 一部分的 AnalyzerNode 用于实时使用。

因此我建议使用Meyda。 Meyda 本身relies on fftjs 用于在离线场景中计算频谱。

这是一个小 sn-p,它将记录 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));
        
    );

【讨论】:

以上是关于用js获取mp3文件频率数据的主要内容,如果未能解决你的问题,请参考以下文章

mediaelement.js MP3无法播放

如何获取音频文件的准确时长,比如MP3

在特定频率上创建 MP3

使用 python 从 mp3 音频文件中获取幅度数据

WPF怎么获取mp3的自然时间然后赋值给progressbar

使用 html5 文件系统 api 获取本地 mp3 文件的元数据