Baseline Widely available
getFloatFrequencyData()
ä½ä¸ºAnalyserNode
æ¥å£çæ¹æ³è½å°å½ååæèç¹ï¼AnalyserNodeï¼çé¢çæ°æ®æ·è´è¿ä¸ä¸ª Float32Array
æ°ç»å¯¹è±¡ã
æ¤æ°ç»è¡¨ç¤ºçé¢çèå´ä¸º 0 ~ 22050 Hzï¼æ¯ä¸ªå ç´ è¡¨ç¤ºå¯¹åºé¢çä¸çä¿¡å·åé强度ï¼åä½ä¸ºåè´ã
å¦æä½ éè¦æ´å¥½çæ§è½å¹¶ä¸ä¸å¤ªå¨ææ°æ®ç精度ï¼ä½ å¯ä»¥ä½¿ç¨ AnalyserNode.getByteFrequencyData()
ä½ä¸ºä»£æ¿ï¼è¿ä¸æ¥å£ä½¿ç¨ Uint8Array
æ¥å卿°æ®ï¼å¯¹åºç乿¯è¿ä¸ªç²¾åº¦çæ ¼å¼ï¼.
getFloatFrequencyData(array)
åæ°
array
ä½ å³å°ç¨äºæ·è´é¢åæ°æ®ï¼frequency domain dataï¼ç Float32Array
æ°ç»ã对äºä»»ä½æ å£°çæ ·æ¬ï¼å®çå¼åºè¯¥æ¯ -Infinity
. 妿è¿ä¸æ°ç»çå¯å®¹çº³å
ç´ æ°å°äºè¯¥åæèç¹çAnalyserNode.frequencyBinCount
å¼ï¼è¶
åºå®¹éçæ°æ®å
ç´ å°è¢«èå¼ãè妿容éå¤äºéè¦ï¼å¤ä½çæ°ç»å
ç´ å°ä¸ä¼è¢«æä½ã
æ è¿åå¼ã
示ä¾const audioCtx = new AudioContext();
const analyser = audioCtx.createAnalyser();
// Float32Array çé¿åº¦åºè¯¥å frequencyBinCount ç¸å
const myDataArray = new Float32Array(analyser.frequencyBinCount);
// ç¨ getFloatFrequencyData() æ¹æ³çè¿åæ°æ®å¡«å
Float32Array æ°ç»
analyser.getFloatFrequencyData(myDataArray);
ä¾ï¼ç»å¶ä¸ä¸ªé¢è°±
ä¸é¢ç示ä¾å±ç¤ºäºä¸ä¸ª AudioContext
å¯¹è±¡è¿æ¥ MediaElementAudioSourceNode
å°AnalyserNode 对象çåºæ¬ç¨æ³ï¼å³ç¨ AudioContext å°é³é¢å
å®¹è¿æ¥å°åæèç¹ï¼ä»èå¯ä»¥å±å¼å¯¹é³é¢æ°æ®çåæï¼
. å½é³é¢ææ¾æ¶ï¼æä»¬ä½¿ç¨ requestAnimationFrame()
æ¹æ³äº§ç轮询ä»è䏿尿¶éé¢çæ°æ®ï¼è¿èå¨ <canvas>
å
ç´ ä¸ç»å¶ winampï¼windows ä¸ç䏿¬¾ MP3 ææ¾è½¯ä»¶ï¼æ¡å½¢å¾é£æ ¼çé¢è°±ã
æ´å¤çåºç¨ç¤ºä¾ååºç¨ä¿¡æ¯ï¼å¯ä»¥åçæä»¬ Voice-change-O-matic-float-data ç¤ºä¾ (å¨ source code åæ ·æ).
<!doctype html>
<body>
<script>
const audioCtx = new AudioContext();
//å建ä¸ä¸ªé³é¢æº
//å¨ç¤ºä¾ä¸æä»¬ä½¿ç¨äºä¸ä¸ªé³é¢æä»¶ï¼ä½å
¶å®è¿éä¹å¯ä»¥ç¨éº¦å
é£è¾å
¥
const audioEle = new Audio();
audioEle.src = "my-audio.mp3"; //è¿éæ¯æä»¶å
audioEle.autoplay = true;
audioEle.preload = "auto";
const audioSourceNode = audioCtx.createMediaElementSource(audioEle);
//çæä¸ä¸ªåæèç¹ (analyser node)
const analyserNode = audioCtx.createAnalyser();
analyserNode.fftSize = 256;
const bufferLength = analyserNode.frequencyBinCount;
const dataArray = new Float32Array(bufferLength);
//设置é³é¢èç¹ç½ç»ï¼é³é¢æº->åæèç¹->è¾åºï¼
audioSourceNode.connect(analyserNode);
analyserNode.connect(audioCtx.destination);
//çæ 2D canvas
const canvas = document.createElement("canvas");
canvas.style.position = "absolute";
canvas.style.top = 0;
canvas.style.left = 0;
canvas.width = window.innerWidth;
canvas.height = window.innerHeight;
document.body.appendChild(canvas);
const canvasCtx = canvas.getContext("2d");
canvasCtx.clearRect(0, 0, canvas.width, canvas.height);
function draw() {
//åå¤å¥½ä¸æ¬¡éç»
requestAnimationFrame(draw);
//è·å宿¶çé¢è°±ä¿¡æ¯
analyserNode.getFloatFrequencyData(dataArray);
//ç»ä¸ä¸ªé»è²çèæ¯
canvasCtx.fillStyle = "rgb(0, 0, 0)";
canvasCtx.fillRect(0, 0, canvas.width, canvas.height);
//ç»å¶é¢è°±
const barWidth = (canvas.width / bufferLength) * 2.5;
let posX = 0;
for (let i = 0; i < bufferLength; i++) {
const barHeight = (dataArray[i] + 140) * 2;
canvasCtx.fillStyle =
"rgb(" + Math.floor(barHeight + 100) + ", 50, 50)";
canvasCtx.fillRect(
posX,
canvas.height - barHeight / 2,
barWidth,
barHeight / 2,
);
posX += barWidth + 1;
}
}
draw();
</script>
</body>
è§è æµè§å¨å
¼å®¹æ§ See also
RetroSearch is an open source project built by @garambo | Open a GitHub Issue
Search and Browse the WWW like it's 1997 | Search results from DuckDuckGo
HTML:
3.2
| Encoding:
UTF-8
| Version:
0.7.4