javascript - 有没有办法从音频文件中获取诸如分贝级别之类的信息并将该信息转换为 json 数组?

标签 javascript json audio html5-audio web-audio-api

这样我就可以使用这些信息来协调页面动画,比如随着分贝水平的提高让元素变得更亮

最佳答案

此方法适用于 Chrome/Safari:

+function(){
  
  var ctx = new AudioContext()
    , url = 'https://cf-media.sndcdn.com/OfjMZo27DlvH.128.mp3?Policy=eyJTdGF0ZW1lbnQiOlt7IlJlc291cmNlIjoiKjovL2NmLW1lZGlhLnNuZGNkbi5jb20vT2ZqTVpvMjdEbHZILjEyOC5tcDMiLCJDb25kaXRpb24iOnsiRGF0ZUxlc3NUaGFuIjp7IkFXUzpFcG9jaFRpbWUiOjE1MTUwNDM5Njd9fX1dfQ__&Signature=FfmL2qUssAKs3Z7EPoYo0Yq8-SAg8rKLPs65EasXwuVkfsOB4joFqeCvVR2elpaG-lJaV4hXpXFiRCDWXNOYyAtO4Oz~sexiPwIoSk8-jWiVbGQRS8TMmUmj7TJzxemMOIj7ugWJKk6PHsrUdgqs9woDpHzxmkGCzk6sfqJEIsdeZJ4rWUFAh4iGWn9M6b0xfzTgndAJmytkNj9raCpWCBVmdr5u-r9nt~q5uF1easNSW9oaFilM4s1Hq2ei~VJye8zW9bzvrGm8idVdy-tiPeMWAKcE8J2VuaS1Ret6jRTRaHTDuiNgA5sZvgTzNpEpKtWI7UmAWI5TrqNVSlxpgQ__&Key-Pair-Id=APKAJAGZ7VMH2PFPW6UQ'  
    , audio = new Audio(url)
    // 2048 sample buffer, 1 channel in, 1 channel out  
    , processor = ctx.createScriptProcessor(2048, 1, 1)
    , meter = document.getElementById('meter')
    , source
    
  audio.crossOrigin = 'anonymous'

  audio.addEventListener('canplaythrough', function(){
    source = ctx.createMediaElementSource(audio)
    source.connect(processor)
    source.connect(ctx.destination)
    processor.connect(ctx.destination)
    audio.play()
  }, false);
  
  // loop through PCM data and calculate average
  // volume for a given 2048 sample buffer
  processor.onaudioprocess = function(evt){
    var input = evt.inputBuffer.getChannelData(0)
      , len = input.length   
      , total = i = 0
      , rms
    while ( i < len ) total += Math.abs( input[i++] )
    rms = Math.sqrt( total / len )
    meter.style.width = ( rms * 100 ) + '%'
  }
  
}()
#meter {
  width: 0%;
  height: 15px;
  margin: 2px 0;
  background: green;
  -webkit-transition: width .05s;
}
<div id="meter"></div>

重要的事情发生在这里:

processor.onaudioprocess = function(evt){
  var input = evt.inputBuffer.getChannelData(0)
    , len = input.length   
    , total = i = 0
    , rms
  while ( i < len ) total += Math.abs( input[i++] )
  rms = Math.sqrt( total / len )
  meter.style.width = ( rms * 100 ) + '%' 
}

基本上,您每 2048 个样本获取一次原始 PCM 数据(值从 -1 到 1),然后循环遍历它们,计算给定时间段内的平均信号电平。

然后您可以使用该值来制作动画。

编辑: 更新为使用 RMS,正如 Jason 指出的那样,这是一种更有意义的测量。

关于javascript - 有没有办法从音频文件中获取诸如分贝级别之类的信息并将该信息转换为 json 数组?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/13734710/

相关文章:

javascript - 为什么 AngularJS 表单发布有时会有一个参数为空?

javascript 谷歌 API

audio - LAME文本在MP3文件中有什么作用?

javascript - 将所有输入数据收集到结构化 json 中

javascript - HTML5 `success` 标记的 `ready` 和 `<audio>` 事件?

javascript - 选择多个div,但使用jQuery播放不同的音频

javascript - 使用indexOf()验证电子邮件

javascript - 视频停止或完成播放时 Google SWFObject javascript 检测

c# - 序列化嵌套的json c#

json - 如何在 libgdx 中启用反射以对我的游戏使用 json 解析