【发布时间】:2015-10-14 02:30:51
【问题描述】:
我刚开始研究 Web Audio API,我正在尝试与音频进行视觉同步。当音频中的音量(节拍?)增加时,我想在屏幕上闪烁白色。到目前为止我做了什么:
var mp3 = "08 - No More Sorrow.mp3";
var context = new AudioContext();
var request = new XMLHttpRequest();
request.open('GET', mp3, true);
request.responseType = "arraybuffer";
request.onload = function () {
context.decodeAudioData(request.response, function (buffer) {
var sourceBuffer = context.createBufferSource();
sourceBuffer.buffer = buffer;
sourceBuffer.connect(context.destination);
sourceBuffer.start(context.currentTime);
});
};
request.send();
...这只是使用 Web Audio API 播放音频。不知道下一步该做什么。我检查了Beat Detection Using JavaScript and the Web Audio API 和Making Audio Reactive Visuals 页面,但什么都不懂。
如果我要向您展示我想在不使用 Web Audio API 的情况下做什么,它会是这样的:
Array.prototype.pushIfExists = function(item) {
if (item) {
this.push(item);
}
}
function random(min, max) {
var min = min || 0;
var max = max || 100;
var num = Math.floor(Math.random() * max);
while (num < min) {
num = Math.floor(Math.random() * max);
}
return num;
}
function avarage(array) {
var sum = 0;
var avarage = 0;
for (var i = 0; i < array.length; i++) {
sum += array[i];
}
avarage = sum / array.length;
return avarage;
}
var beats = [];
var delay = 500;
var delayIncrement = 200;
var threshold = 50;
var thresholdLimit = 100;
var beatAvarageRange = 5;
var flashDuration = 100;
for (var i = 0; i < 100; i++) {
beats.push(random(0, thresholdLimit));
}
for (var i = 0; i < beats.length; i++) {
(function(i) {
setTimeout(function() {
var recentBeats = [];
for (var j = 1; j < beatAvarageRange + 1; j++) {
recentBeats.pushIfExists(beats[i - j]);
}
threshold = avarage(recentBeats);
if (beats[i] > threshold) {
document.body.style.backgroundColor = "white";
setTimeout(function() {
document.body.style.backgroundColor = "black";
}, flashDuration);
}
}, delay);
delay += delayIncrement;
})(i);
}
body {
background-color: black;
}
【问题讨论】:
-
我喜欢在 SO 上看到有关 Web Audio API 的好问题,并进行了一些复制编辑,只是本着为您提供一些(次要)帮助以在此处获得答案的精神。 (并赞成。)
-
@sideshowbarker 这似乎是我自己要解决的问题之一。很高兴看到还没有人回答,结果很好。
标签: javascript html audio web-audio-api