Javascript MediaElementSource在Web音频API中使用的内存是否比BufferSource少?

Javascript MediaElementSource在Web音频API中使用的内存是否比BufferSource少?,javascript,web-audio-api,Javascript,Web Audio Api,我正在做一个小应用程序,将播放音频文件(mp3,wav)的能力,使用一个均衡器对他们(说一个普通的音频播放器),为此,我使用的是网络音频Api 我设法从两个方面得到这个角色。使用 使用Audio()和 我认为第二个比createBufferSource()使用更少的内存,因为createBufferSource()将完整的音频文件存储在内存中。但我不确定这一点,我真的没有太多的经验,像Chrome开发工具来正确阅读它 createMediaElementSource()使用的内存是否比creat

我正在做一个小应用程序,将播放音频文件(mp3,wav)的能力,使用一个均衡器对他们(说一个普通的音频播放器),为此,我使用的是网络音频Api

我设法从两个方面得到这个角色。使用

使用
Audio()

我认为第二个比
createBufferSource()
使用更少的内存,因为
createBufferSource()
将完整的音频文件存储在内存中。但我不确定这一点,我真的没有太多的经验,像Chrome开发工具来正确阅读它

createMediaElementSource()
使用的内存是否比
createBufferSource()

编辑:
使用Chrome的任务管理器就像使用
createBufferSource()
时一样,只需加载文件就可以增加大约40000k的内存列,而使用
createMediaElementSource()
时会增加+/-60k的内存,Javascript内存1000k对20k,我想你已经在任务管理器中找到了答案

你需要注意几件事

  • 使用媒体元素时,您将失去对样本的精确控制;这对你来说可能并不重要

  • 使用
    MediaElementAudioSourceNode
    时需要适当的访问权限;如果您的所有资产都在同一台服务器上,这可能不是问题

我最终将使用
BiquadFilter
dynamiccompressor
。我认为它不需要样品控制,不是吗?我还希望最终尝试使用Soundcloud或Youtube等提供商提供的外部API。我知道你可以将Soundcloud曲目插入Web音频Api。。。对Youtube不太清楚。不知道您的用例实际上是什么,但听起来您不需要源代码的精确启动和停止示例。不过,您也需要对XMLHTTPRequest具有适当的访问权限,所以这并没有什么不同。
function getData() {
  source = audioCtx.createBufferSource();
  var request = new XMLHttpRequest();

  request.open('GET', 'viper.ogg', true);

  request.responseType = 'arraybuffer';


  request.onload = function() {
    var audioData = request.response;

    audioCtx.decodeAudioData(audioData, function(buffer) {
        source.buffer = buffer;

        source.connect(audioCtx.destination);
        source.loop = true;
      },

      function(e){ console.log("Error with decoding audio data" + e.err); });

  }

  request.send();
}

// wire up buttons to stop and play audio

play.onclick = function() {
  getData();
  source.start(0);
  play.setAttribute('disabled', 'disabled');
}
let audioContainer = new Audio('assets/mp3/pink_noise.wav');
let _sourceNodes = _AudioContext.createMediaElementSource(_audioContainer);
_sourceNodes.connect(_AudioContext.destination);
_audioContainer.play();