使用WebAudio API计算现场麦克风音频频率的简单代码
Simple code to calculate frequency of Live Mic Audio using WebAudio API
我有一个网站,需要在其中显示实时麦克风音频的频率。我有一个这个代码,但它非常难理解(它使用傅立叶变换和所有)。在一些研究中,我了解了返回音频频率的getByteFrequencyData()
。以前有人在网络音频API中使用过现场麦克风音频吗?
我写了一个简单的代码,你可以在网页中显示频率:
const audioCtx = new AudioContext();
const analyser = audioCtx.createAnalyser();
const source = audioCtx.createMediaElementSource(audio);
source.connect(analyser);
analyser.connect(audioCtx.destination);
analyser.fftSize = 32;
let frequencyData = new Uint8Array(analyser.frequencyBinCount);
function renderFrame() {
analyser.getByteFrequencyData(frequencyData);
P10.style.height = ((frequencyData[0] * 100) / 256) + "%";
P20.style.height = ((frequencyData[1] * 100) / 256) + "%";
P30.style.height = ((frequencyData[2] * 100) / 256) + "%";
P40.style.height = ((frequencyData[3] * 100) / 256) + "%";
P50.style.height = ((frequencyData[4] * 100) / 256) + "%";
P60.style.height = ((frequencyData[5] * 100) / 256) + "%";
P70.style.height = ((frequencyData[6] * 100) / 256) + "%";
P80.style.height = ((frequencyData[7] * 100) / 256) + "%";
P90.style.height = ((frequencyData[8] * 100) / 256) + "%";
console.log(frequencyData)
requestAnimationFrame(renderFrame);
}
audio.pause();
audio.play();
renderFrame();
#bar {
position: fixed;
top: 20%;
left: 40%;
width: 40%;
height: 40%;
-webkit-transition: 0.1s ease all;
}
.p {
background-color: blue;
height: 100%;
width: 10%;
float: left;
}
<audio id="audio" src="2.mp3"></audio>
<div id="bar">
<div id="P10" class="p"></div>
<div id="P20" class="p"></div>
<div id="P30" class="p"></div>
<div id="P40" class="p"></div>
<div id="P50" class="p"></div>
<div id="P60" class="p"></div>
<div id="P70" class="p"></div>
<div id="P80" class="p"></div>
<div id="P90" class="p"></div>
</div>
祝你好运。
"显示频率"可能意味着很多事情。事实上,我的PitchDetect演示不使用傅立叶变换,而是使用自相关。但这只会给你一次高精度的投球。如果你的信号同时有多个音符,那就很难了。
如果你想查看现场麦克风输入的频率分析明细,请查看http://webaudiodemos.appspot.com/AudioRecorder/index.html(代码位于https://github.com/cwilso/AudioRecorder)。它使用RealtimeAnalyser中的内置FFT来显示实时音频信号的频谱图。
相关文章:
- 简单的javascript在Shopify中不起作用
- Firebase迁移-简单的Firebase.set没有'不再工作了——旧的还是新的
- 如何制作简单的php'在Javascript中的foreach等价物
- JQuery:向多个匹配结果添加换行符的最简单方法
- AJAX简单错误.XMLHttpRequest无法加载http://localhost/mpl/getPage.php.
- Moment/Jquery-一个简单时间线的愚蠢问题
- 什么's本地node.js服务器和python简单http服务器之间的区别
- 简单类测试未通过
- 简单地将拆分变量添加到对象中
- 通过javascript操作图像,非常简单
- 问题用moment JS制作一个简单的时间表
- 简单的ES6承诺问题-交换解决和拒绝参数
- 带有计数器、缩略图、进度条和淡入淡出效果的简单jQuery幻灯片
- 简单的JS函数.需要对变量进行澄清
- 简单的交换程序无法使用javascript
- 如何只使用特定的表行构建简单的手风琴
- 我怎么能让流星简单模式中的一个字段等于一个js变量,并且仍然让用户填写简单模式的其余部分
- react路由器使用简单的javascript路由器配置来处理不匹配的路径
- 简单的字符频率计数器,但为什么赢得'计数不是实时发生的
- 使用WebAudio API计算现场麦克风音频频率的简单代码