寻求音频文件后JS onaudioprocess不良数据

时间:2019-04-24 16:27:00

标签: javascript html5 audio html5-audio audiocontext

我需要从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;
        }
    };

0 个答案:

没有答案