【问题标题】:Does Web Audio API support a queue of multiple input buffers?Web Audio API 是否支持多个输入缓冲区的队列?
【发布时间】:2018-05-25 01:08:49
【问题描述】:

我正在将通过网络(通过网络套接字)到达的浏览器(移动/桌面)中的音频呈现为可能无穷无尽的连续音频缓冲区流(Float32Array 类型的数组),并尽量减少播放饥饿的机会我想要在开始音频渲染之前排队多个缓冲区。 Web Audio API 是否支持排队多个缓冲区(如 OpenAL)以流方式顺序呈现的概念?我不是在说同时渲染多个缓冲区。在我自己动手之前......

【问题讨论】:

    标签: message-queue audio-streaming web-audio-api


    【解决方案1】:

    这是你需要自己处理的事情。据我所知,没有办法将多个缓冲区排队供 API 自行播放。

    您可以使用ScriptProcessorNode 来实现自己。

    【讨论】:

      【解决方案2】:

      网络音频 API 不支持缓冲区队列。相反,您可以自己连接缓冲区(假设您有 buffer1 和 buffer2):

      var tempBuffer = context.createBuffer(buffer1.numberOfChannels, buffer1.length+buffer2.length, buffer1.sampleRate);
      //now we need to concatenate the buffers for each channel
      for(var i=0;i<buffer1.numberOfChannels;i++){
          var channel = tempBuffer.getChannelData(i);
          channel.set(buffer1.getChannelData(i), 0); //this puts the data of buffer1 in the channel var, starting at offset 0
          channel.set(buffer2.getChannelData(i), buffer1.length); //this starts at the offset of buffer1.length, so it is exactly placed after buffer1
      }
      //tempBuffer now contains your 2 buffers concatenated
      

      当您谈论的是流时,如果您只有一个传入流,这会有点困难。如果您使用scriptProcessor 来删除空白处,则必须在此处放置一些东西或仅删除静音,但是重新调整的样本太短并且您仍然会出现间隙。一个解决方案是在 scriptProcessor 之外设置一个缓冲区。每次 scriptProcessor 触发时,您都可以检查静音,将其剪掉并将其放在缓冲区之外的末尾,并且不返回任何内容。然后,在该缓冲区中有 x 秒的音频后,您可以播放它。唯一的缺点是每次删除某些东西时 x 秒偏移量都会变小,并且它会达到缓冲区变得如此小以至于没有音频可以播放并且可能会饿死的地步。除此之外,我不确定在播放时将音频放入缓冲区中。你应该先试试看。

      【讨论】:

      • 取决于您如何接收流,不过我必须查看您的代码。
      • @brad 很难在手机上看到不是 OP 提出这个问题的。这在很大程度上取决于他如何接收流。如果他通过 webRTC 以MediaStream 的形式接收它,则他无法通过音频 API 路由它(尚未实现)。如果他只有一个流,那就很难了,因为这意味着使用 scriptProcessorNode 从中获取一个缓冲区,然后检查是否有间隙,然后毫无间隙地重新发送它,但是他将如何填补这些间隙? (如果他只是把间隙剪掉,那么返回的样本太短了,还有一点地方没有音频,但在最后)。
      • 我真正要问的是,当缓冲区已经开始播放时,您将无法连接缓冲区,对吧?我最后一次对此进行的实验并没有什么成果,但 Web Audio API 的发展速度非常快,这就是我问的原因。
      • @brad 这是我在原始答案中添加的内容,我不确定它是否会起作用(理论上可以)。遗憾的是,我们对收到的“连续音频缓冲区的无尽流”没有任何了解。
      【解决方案3】:

      这是一个需要媒体源扩展的问题:https://dvcs.w3.org/hg/html-media/raw-file/tip/media-source/media-source.html

      它在 Chrome、IE11 和 Firefox 中可用。

      如果您仍然想使用网络音频来实现,请查看this 项目和此other 代码。

      【讨论】:

        【解决方案4】:

        我推出了自己的实现...浏览器启动到 nodejs 服务器的 websocket 连接,该服务器通过将类型化数组缓冲区流发送回浏览器来响应...浏览器中的 web worker 管理所有此类 websocket 流量和populates a Transferable Object shared buffer浏览器端是否可以通过 Web Audio API 事件循环访问...因为事件循环消耗这个循环缓冲区队列,它会触发 webworker 从服务器端请求更多...it worked when I finished it 使用 nodejs 0.10.x 但是现代 nodejs 打破它see source here

        【讨论】:

          猜你喜欢
          • 2014-04-10
          • 2016-04-26
          • 1970-01-01
          • 2013-10-16
          • 1970-01-01
          • 1970-01-01
          • 2015-08-30
          • 2018-01-25
          • 1970-01-01
          相关资源
          最近更新 更多