我正在使用 Web API 创建一个音频条可视化工具,我希望这些条只显示 ~ 40Hz 到 ~10kHz。我发现的唯一东西是频域,但这并没有为我提供我正在寻找的东西(AnalyserNode.fftSize)。有没有办法只可视化该频率?这是我的代码:
.controller('PlayerCtrl', function(PlayerService, $scope){
$scope.title = PlayerService.songName;
$scope.art = PlayerService.songArt;
$scope.url = PlayerService.songUrl + '?client_id=54970813fe2081a104a874f0f870bcfe';
if (! window.AudioContext) {
if (! window.webkitAudioContext) {
alert('no audiocontext found, update your browser yo');
}
window.AudioContext = window.webkitAudioContext;
}
var audioCtx = new (window.AudioContext || window.webkitAudioContext)();
var analyser = audioCtx.createAnalyser();
analyser.minDecibels = -60;
analyser.maxDecibels = 0;
analyser.smoothingTimeConstant = 0.85;
var audioBuffer;
var sourceNode;
var javascriptNode;
var canvas = document.querySelector('.visualizer');
var canvasCtx = canvas.getContext("2d");
var intendedWidth = document.querySelector('.now-playing').clientWidth;
canvas.setAttribute('width',intendedWidth);
var visualSelect = document.getElementById("visual");
var drawVisual;
setupAudioNodes();
loadSound($scope.url); //music file
function loadSound(url) {
var request = new XMLHttpRequest();
request.open('GET', url, true);
request.responseType = 'arraybuffer';
request.onload = function() {
audioCtx.decodeAudioData(request.response, function(buffer) {
playSound(buffer);
}, function(error){
console.log(error)
});
};
request.send();
}
function playSound(buffer) {
sourceNode.buffer = buffer;
sourceNode.start(0);
$(".content").show();
$("#hue").hide();
}
function setupAudioNodes() {
console.log('audio nodes')
javascriptNode = audioCtx.createScriptProcessor(2048, 1, 1);
javascriptNode.connect(audioCtx.destination);
sourceNode = audioCtx.createBufferSource();
sourceNode.connect(analyser);
analyser.connect(javascriptNode);
sourceNode.connect(audioCtx.destination);
visualize();
}
function visualize() {
console.log('viz');
WIDTH = canvas.width;
HEIGHT = canvas.height;
analyser.fftSize = 64;
var bufferLength = analyser.frequencyBinCount;
console.log(bufferLength);
var dataArray = new Uint8Array(bufferLength);
canvasCtx.clearRect(0, 0, WIDTH, HEIGHT);
function draw() {
drawVisual = requestAnimationFrame(draw);
analyser.getByteFrequencyData(dataArray);
canvasCtx.fillStyle = 'rgb(0, 0, 0)';
canvasCtx.fillRect(0, 0, WIDTH, HEIGHT);
var barWidth = (WIDTH / bufferLength) * 2.5;
var barHeight;
var x = 0;
for (var i = 0; i < bufferLength; i++) {
barHeight = dataArray[i];
canvasCtx.fillStyle = 'rgb(' + (barHeight + 100) + ',50,50)';
canvasCtx.fillRect(i*17, HEIGHT - barHeight / 2, 10, barHeight);
x += barWidth + 1;
}
}
draw()
}
})