我们一直在研究基于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}},796330和813825似乎相关)。
以下是有关代码功能的详细信息:
处理方法如下。变量“ 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。
感谢您阅读以及您可能提供的任何建议。