在 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的流式音频吗?

使用 Web Audio API 和 Wrtc 进行远程音频处理