使用AudioWorklet传输捕获的音频时,如何防止分手/断断续续/毛刺?

时间:2019-02-20 19:37:51

标签: javascript websocket web-audio getusermedia scriptprocessor

我们一直在研究基于JavaScript的音频聊天客户端,该客户端在浏览器中运行,并通过WebSocket将音频样本发送到服务器。我们之前曾尝试使用Web Audio API的ScriptProcessorNode来获取示例值。这在我们的台式机和笔记本电脑上效果很好,但是在从我们必须支持的手持平台进行传输时,我们遇到了较差的音频质量。我们将其归因于已记录的脚本处理器性能问题(https://developer.mozilla.org/en-US/docs/Web/API/Web_Audio_API)。在手持式设备上,脚本处理器缓冲区大小为2048,音频始终会出现中断。在下一个最大大小间隔(4096),音频平滑(没有破裂),但是延迟过多(大约两秒钟)。

我们从ScriptProcessorNode获得的结果促使我们尝试使用Audio Worklet。不幸的是,通过我们的Worklet实施,即使在我们的笔记本电脑上,音频质量也更差:中断和延迟都很高。我想知道是否有一种方法可以调整我们的Worklet实施以获得更好的性能,或者我们期望从音频Worklet的当前状态(“当然”)获得期望(Chromium问题{ {3}},796330813825似乎相关)。

以下是有关代码功能的详细信息:

  1. 使用从getUserMedia获得的MediaStream创建MediaStreamStreamSourceNode。
  2. 将源节点连接到我们的Worklet节点实现(扩展AudioWorkletNode)。
  3. 我们的Worklet处理器实现(扩展了AudioWorkletProcessor)缓冲作为其处理方法的“输入”参数到达的块。
  4. 当缓冲区已满时,使用MessagePort将缓冲区内容发送到Worklet节点。
  5. Worklet节点通过WebSocket连接传输缓冲区内容。

处理方法如下。变量“ samples”是一个Float32Array,它被初始化为缓冲区大小并重新使用。我已经尝试了一些缓冲区大小,但是似乎没有影响。该方法基于836306第4.1节中的指导,以最大程度地减少内存分配。

if (micKeyed == true) {

    if (inputs[0][0].length == framesPerBlock) {
        samples.set(inputs[0][0], currentBlockIndex * framesPerBlock);
        currentBlockIndex++;

        if (currentBlockIndex == lastBlockIndex) {
            // console.log('About to send buffer.');
            this.port.postMessage(samples);
            currentBlockIndex = 0;
        }
    } else {
        console.error("Got a block of unexpected length!!!");
    }
}
return true;

当前正在使用在CentOS 7上运行Chrome 72.0.3626.109的PC进行测试。我们的手持设备是在Android 6.0.1上运行Chrome 72.0.3626.105的Panasonic FZ-N1。

感谢您阅读以及您可能提供的任何建议。

0 个答案:

没有答案