无法构造'AudioContext':硬件上下文的数量达到最大值

时间:2014-07-30 20:37:34

标签: javascript web-audio

有没有办法在我创建后删除AudioContext

var analyzers = [];
var contexts = [];

try {
   for(var i = 0; i<20; i++) {
      contexts[i] = new AudioContext();
      analyzers[i] = contexts[i].createAnalyser();
   }
}catch(e) {
   console.log(e);
   // too many contexts created -- how do I remove them?
}

我已经尝试过这个,但它不允许我在事后创建新的上下文:analyzers.forEach(function(analyzer){analyzer.disconnect(analyzer.context.destination)})

我在Ubuntu Linux 14.04上使用Chrome 36。

5 个答案:

答案 0 :(得分:29)

AudioContext.close()将释放上下文的硬件,但检查它是否仅适用于最新版本的chrome和firefox。显然不适用于IE。 查看文档: https://developer.mozilla.org/en-US/docs/Web/API/AudioContext/close

答案 1 :(得分:17)

页面中应该只有一个AudioContext

来自文档:&#34;在大多数用例中,每个文档只使用一个AudioContext。&#34;

我无法想到你为什么需要多个原因。您是否遇到了导致您创建多个上下文的特定问题?

答案 2 :(得分:6)

将其引用到变量即:
<?php $usernameVal=$_REQUEST["username"]; //$passwordVAl=$_REQUEST["password"]; $servername = "localhost"; $username = "root"; $password = ""; $dbname = "learn2crack-login-register"; // Create connection $conn = new mysqli($servername, $username, $password, $dbname); // Check connection if ($conn->connect_error) { die("Connection failed: " . $conn->connect_error); } else { $escapedPW = mysqli_real_escape_string($conn,$_REQUEST['password']);
然后通过呼叫摧毁 var myAudioCtx = new AudioContext();
就是这样。

答案 3 :(得分:0)

我正在开发一个媒体播放器小部件,只要在一个页面中嵌入了超过五个,就会破坏Chrome(但不是Firefox)。

我发现您可以创建一个AudioContext并将其全局存储,然后让每个实例只使用共享的AudioContext。它似乎没有区别 - 你可以附加多个缓冲区和多个目的地,音频都混合在一起。

如果你将它用于计时,这可能需要更多的努力,但是为了回放使用JS代码即时生成的一个或多个音频流,共享一个<div class="colourword">Anyword</div> function getRandomColor() { var letters = '0123456789ABCDEF'; var color = '#'; for (var i = 0; i < 6; i++ ) { color += letters[Math.floor(Math.random() * 16)]; } return color; } var colors = getRandomColor(); $('colourword').html(function() { return $.map($(this).text().split(''), function(el, i) { return '<span style="color:' +colors+ '";>' + el + '</span>'; }).join(''); }); 可以正常工作。

答案 4 :(得分:0)

在每次单击之前将其关闭。如果您使用计时器延迟关闭,则可能会出现播放不完整的情况,尤其是在切换文件时。

const audioPlay = (() => {
  let context = null;
  return async () => {
    if (context) context.close();
    context = new AudioContext();
    const source = context.createBufferSource();
    source.buffer = await fetch('./2.mp3')
      .then(res => res.arrayBuffer())
      .then(arrayBuffer => context.decodeAudioData(arrayBuffer));
    source.connect(context.destination);
    source.start();
  };
})();

document.querySelector('#add').addEventListener('click', audioPlay);

不推荐

 setTimeout(() => { context.close();}, 400);