使用WebAudio API计算实时麦克风音频频率的简单代码

11

我有一个网站,需要显示现场麦克风音频的频率。 我有一个这个代码,但极难理解(它使用傅里叶变换等)。 在一些研究中,我了解到getByteFrequencyData()可以返回音频的频率。是否有人曾经在Web Audio API中使用过它与现场麦克风音频?

2个回答

16

我写了一个简单的代码,可以在你的网页中展示频率:

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>

祝你好运。


我正在寻找像这样带有条形图的简单示例,谢谢! - Macumbaomuerte
我简直不敢相信,太完美了!谢谢! - Léo Durand

12
"显示频率"可以有很多含义。实际上,我的PitchDetect演示不使用傅里叶变换,而是使用自相关。但这只会给你一个高精度的单音高。如果您的信号具有多个同时发生的音符,那么这是一个困难的问题。
如果您想查看实时麦克风输入的频率分析图,请查看http://webaudiodemos.appspot.com/AudioRecorder/index.html(代码在https://github.com/cwilso/AudioRecorder)。它使用RealtimeAnalyser中内置的FFT来显示实时音频信号的频谱图。"

var audioContext = new AudioContext(); 处出现了错误。 AudioContext 未被允许启动。它必须在页面上的用户手势之后恢复(或创建)。 - MisterGeeky

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接