js调用麦克风,并根据麦克风展示音柱,给出完整详细代码
时间: 2024-03-26 11:40:58 浏览: 22
以下是一个基于HTML5的实现调用麦克风并展示音柱的代码:
```html
<!DOCTYPE html>
<html>
<head>
<meta charset="UTF-8">
<title>音柱展示</title>
<style>
#visualizer {
width: 100%;
height: 200px;
background: #eee;
margin-top: 20px;
}
</style>
</head>
<body>
<h1>音柱展示</h1>
<div id="visualizer"></div>
<script>
window.AudioContext = window.AudioContext || window.webkitAudioContext;
var context = new AudioContext();
var analyser = context.createAnalyser();
var microphone;
navigator.mediaDevices.getUserMedia({ audio: true })
.then(function(stream) {
microphone = context.createMediaStreamSource(stream);
microphone.connect(analyser);
visualize();
})
.catch(function(err) {
console.log('getUserMedia error: ' + err);
});
function visualize() {
analyser.fftSize = 2048;
var bufferLength = analyser.frequencyBinCount;
var dataArray = new Uint8Array(bufferLength);
var canvas = document.getElementById('visualizer');
var canvasCtx = canvas.getContext('2d');
function draw() {
requestAnimationFrame(draw);
analyser.getByteFrequencyData(dataArray);
canvasCtx.fillStyle = 'rgb(200, 200, 200)';
canvasCtx.fillRect(0, 0, canvas.width, canvas.height);
var barWidth = (canvas.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(x,canvas.height-barHeight/2,barWidth,barHeight/2);
x += barWidth + 1;
}
};
draw();
}
</script>
</body>
</html>
```
解释一下代码:
1. 首先,我们创建一个`AudioContext`对象,它是Web Audio API中的核心对象,用于处理音频。然后创建一个`AnalyserNode`对象,用于分析音频数据。
2. 调用`navigator.mediaDevices.getUserMedia`方法请求访问用户的麦克风,得到一个`MediaStream`流对象,将其传给`MediaStreamAudioSourceNode`对象,使得麦克风的音频可以被处理。
3. 在`visualize`函数中,我们将`AnalyserNode`对象的`fftSize`属性设置为2048,表示分析音频数据时使用的快速傅里叶变换的大小。创建一个`Uint8Array`数组,用于存放分析后的音频数据。
4. 获取`canvas`绘图上下文,创建`draw`函数,该函数以一定的频率(通常是60次/秒)更新画布上的音柱。在`draw`函数中,首先使用`analyser.getByteFrequencyData`方法获取分析后的音频数据,然后绘制一组音柱,每个音柱的高度对应着相应频率的音量大小。
这个代码可以根据你的需求进行修改,比如修改音柱的颜色、高度、宽度等等。