簡體   English   中英

用js獲取mp3文件頻率數據

[英]Getting mp3 file frequency data with js

有沒有辦法在播放之前獲取 mp3 數據(它的頻率)? 請注意,我不必全部掌握 - 如果我能得到它就足以給我“進入未來”5 秒的幀數據(尚未播放的幀)。 我還需要它是客戶端/瀏覽器端,而不是服務器端。 有沒有辦法做到這一點?

您不必 stream 將音頻數據從 WebAudioAPI 傳輸到 output 源。 這是他們通常在教程中使用的 node.network:

    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);

然后您可以在兩個相同的音頻文件上運行此代碼,每個文件具有不同的時間戳,並保存無聲文件中的數據。

正如您已經提到的, AnalyzerNode是 Web 音頻 API 的一部分,用於實時使用。

因此我建議使用Meyda Meyda 本身在離線場景中使用時依賴於fftjs來計算頻譜。

這是一個小片段,它將記錄 512 個樣本的每個塊的振幅頻譜,在 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));
        }
    });

有沒有辦法在播放之前獲取 mp3 數據(它的頻率)? 請注意,我不必全部獲取 - 如果我能得到它,只為我提供“未來”5 秒的幀數據(尚未播放的幀)就足夠了。 我還需要它是客戶端/瀏覽器端,而不是服務器端。 有沒有辦法做到這一點?

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM