在 Web Audio API 中导出音频强度
Posted
技术标签:
【中文标题】在 Web Audio API 中导出音频强度【英文标题】:Exporting intensity of audio in Web Audio API 【发布时间】:2014-02-28 19:21:00 【问题描述】:我正在尝试使用 Web Audio API 来查找音频的强度。我在规范中发现的与强度相关的唯一内容是:
analyser.minDecibels
analyser.maxDecibels
有没有办法做到这一点?
【问题讨论】:
【参考方案1】:如果我理解正确,您想要一个在声音响亮时高,在声音安静时低的数字。您可以为此使用“声压级”。
从 Web Audio API 获取这个数字相当简单,您猜对了,我们将使用 AnalyserNode 来实现这一点。这是一个示例代码,向您展示如何做到这一点:
var ac = new AudioContext();
/* create the Web Audio graph, let's assume we have sound coming out of the
* node `source` */
var an = ac.createAnalyser();
source.connect(an);
/* Get an array that will hold our values */
var buffer = new Uint8Array(an.fftSize);
function f()
/* note that getFloatTimeDomainData will be available in the near future,
* if needed. */
an.getByteTimeDomainData(buffer);
/* RMS stands for Root Mean Square, basically the root square of the
* average of the square of each value. */
var rms = 0;
for (var i = 0; i < buffer.length; i++)
rms += buffer[i] * buffer[i];
rms /= buffer.length;
rms = Math.sqrt(rms);
/* rms now has the value we want. */
requestAnimationFrame(f);
requestAnimationFrame(f);
/* start our hypothetical source. */
source.start(0);
【讨论】:
【参考方案2】:我想感谢您大约 4 年后的回答。 我刚刚做了一个快速 POC 并让它与以下代码一起工作。我希望它也可以帮助其他人。
在这个例子中,我从我的麦克风中获取实时音频并将结果记录到控制台 - 在我的例子中,在 chrome 开发工具下。
<html>
<head>
<title>Intensity test</title>
</head>
<body>
<script>
var ac = new AudioContext();
var an = ac.createAnalyser();
var source = "";
var buffer = new Uint8Array(an.fftSize);
var scriptProcessorNode = ac.createScriptProcessor(16384, 1, 1);
if (!navigator.getUserMedia)
navigator.getUserMedia = navigator.getUserMedia ||
navigator.webkitGetUserMedia || navigator.mozGetUserMedia ||
navigator.msGetUserMedia;
if (navigator.getUserMedia)
navigator.getUserMedia(
audio:true,
function(stream)
source = ac.createMediaStreamSource(stream);
source.connect(an);
requestAnimationFrame(f);
,
function(e)
alert('Error capturing audio.');
);
function f()
an.getByteTimeDomainData(buffer);
var rms = 0;
for (var i = 0; i < buffer.length; i++)
rms += buffer[i] * buffer[i];
rms /= buffer.length;
rms = Math.sqrt(rms);
requestAnimationFrame(f);
console.log(rms);
</script>
</body>
</html>
【讨论】:
以上是关于在 Web Audio API 中导出音频强度的主要内容,如果未能解决你的问题,请参考以下文章
如何在 Web Audio API 中更改音频缓冲源的时间?
如何下载我刚刚使用 Web Audio API 创建的声音?
是否有抽象 Web Audio API 和 Mozilla Audio Data API 以读取原始音频(MP3,ogg)的库
从 url 中提取音频片段并使用纯 Web Audio API 播放
可以使用Web Audio API和createMediaElementSource分析来自Icecast的流式音频吗?