如何在javascript web audio api中获得声音能量?

Tar*_*ych 7 javascript html5-audio web-audio-api

我想创建一个JS库来检测歌曲BPM.
我读过这篇 文章并理解了算法.
获得10秒声能数据是否正确?我是新手.如果您不理解代码的某些部分,请询问

var audioFileInput = document.querySelector('#audio-file-input');
var audioCtx = new AudioContext();

// call countBpm function on "change" event in audioFileInput
audioFileInput.onchange = function() {
  var file = this.files[0];
  var reader = new FileReader();
  reader.onload = function() {
    countBpm(reader.result)
  };
  reader.readAsArrayBuffer(file);
};

function countBpm(buffer) {
  audioCtx.decodeAudioData(buffer, function(decodedData) {
    var dataFromLeftChannel = getSoundDataFromMiddle(decodedData, 'left');
    var dataFromRightChannel = getSoundDataFromMiddle(decodedData, 'right');
    console.dir(dataFromLeftChannel);
    console.dir(dataFromRightChannel);
    // code to detect bpm will be here
  })
};

// get 10 seconds sound energy data from channels
function getSoundDataFromMiddle(decodedData, channel) {
  var positions = {};
  positions.start = (decodedData.length / 2) - 220500;
  positions.end = (decodedData.length / 2) + 220500;

  if (channel === 'left') {
    return decodedData.getChannelData(0).subarray(positions.start, positions.end);
  } else if (channel === 'right') {
    return decodedData.getChannelData(1).subarray(positions.start, positions.end);
  } else {
    return null;
  }
}
Run Code Online (Sandbox Code Playgroud)
<input id="audio-file-input" type="file" accept="audio/*"></input>
Run Code Online (Sandbox Code Playgroud)