Мне нужно рассчитать некоторые данные из 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;
}
};