JS onaudioprocess неверные данные после поиска аудио файла - PullRequest
0 голосов
/ 24 апреля 2019

Мне нужно рассчитать некоторые данные из mp3-файла, поэтому я решил использовать onaudioprocess. Если я позволю звуковому файлу воспроизводиться в реальном времени, я получу, по-видимому, достаточно хорошие данные. Когда я пытаюсь сэмплировать определенные точки, произнесите каждые 3 секунды звука, он возвращает данные мусора.

window.AudioContext = window.AudioContext ||
    window.webkitAudioContext ||
    window.mozAudioContext ||
    window.oAudioContext ||
    window.msAudioContext;

var ctx = new AudioContext();

var url = 'test_file_1.mp3';
var audio = new Audio(url);

var waiting_for_seek = false;

audio.addEventListener('seeking', function() {
        console.log("seeking");
        wait_for_seek = true;
    }, false);

audio.addEventListener('seeked', function() {
        console.log("seeked");
        wait_for_seek = false;
    }, false);

processor = ctx.createScriptProcessor(2048, 1, 1);

audio.addEventListener('canplaythrough', function() {
        source = ctx.createMediaElementSource(audio);
        source.connect(processor);
        source.connect(ctx.destination);
        processor.connect(ctx.destination);
        audio.volume = 0;
        audio.muted = true;
        audio.play();
    }, false);

processor.onaudioprocess = function(evt) {
        if(!wait_for_seek){
            var input = evt.inputBuffer.getChannelData(0);
            var len = input.length;
            var total = 0;
            var i = 0;
            while(i<len)
                total += Math.abs(input[i++]);
            var rms = Math.sqrt(total/len);
            var dBs = (Math.log(rms) / Math.log(10));
            console.log(audio.currentTime+" "+rms+" "+dBs)

            wait_for_seek = true;

            //if you comment out the next line it works
            audio.currentTime += 3;
        }
    };
...