Javascript 使用AudioWorklet流式传输捕获的音频时,如何防止中断/断断续续/故障?
我们一直在开发一个基于JavaScript的音频聊天客户端,它在浏览器中运行,并通过WebSocket将音频样本发送到服务器。我们以前曾尝试使用Web Audio API的ScriptProcessorNode来获取示例值。这在我们的台式机和笔记本电脑上运行得很好,但在从我们必须支持的手持平台进行传输时,我们的音频质量很差。我们将此归因于有文档记录的脚本处理器性能问题()。在手持设备上,脚本处理器缓冲区大小为2048,音频始终有中断。在下一个最大的间隔(4096),音频是平滑的(没有中断),但是延迟太多(大约两秒) 我们从ScriptProcessorNode得到的结果促使我们对音频工作集进行了实验。不幸的是,在我们的工作集实现中,音频质量更差:中断和延迟,甚至在笔记本电脑上。我想知道是否有办法调整我们的工作集实现以获得更好的性能,或者我们正在经历的是音频工作集的当前状态(铬问题,并且似乎相关)的预期(是“课程标准”) 下面是关于代码作用的更多细节:Javascript 使用AudioWorklet流式传输捕获的音频时,如何防止中断/断断续续/故障?,javascript,websocket,web-audio-api,getusermedia,scriptprocessor,Javascript,Websocket,Web Audio Api,Getusermedia,Scriptprocessor,我们一直在开发一个基于JavaScript的音频聊天客户端,它在浏览器中运行,并通过WebSocket将音频样本发送到服务器。我们以前曾尝试使用Web Audio API的ScriptProcessorNode来获取示例值。这在我们的台式机和笔记本电脑上运行得很好,但在从我们必须支持的手持平台进行传输时,我们的音频质量很差。我们将此归因于有文档记录的脚本处理器性能问题()。在手持设备上,脚本处理器缓冲区大小为2048,音频始终有中断。在下一个最大的间隔(4096),音频是平滑的(没有中断),但是
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。我们的手持设备是松下FZ-N1,在安卓6.0.1上运行Chrome 72.0.3626.105
感谢您的阅读和提供的任何建议。您是否尝试过使用
MediaSource
?另见;也;谢谢您的回复@guest271314。我没有试过MediaSource,但它看起来很有趣。然而,在我们的例子中,我相信延迟和中断的来源是客户端中的捕获/传输管道,而不是播放/接收管道(MediaSource似乎适用的管道)。我们已经听到了相当好的质量播放时,音频捕获和传输的客户端运行在相对强大的硬件。当我们为回放客户端保持硬件不变,但为捕获客户端切换到功能较弱的硬件时,回放质量变得不可接受。您如何在客户端代码中处理不同的硬件?@guest271314:在我们的测试中,当发送客户机是手持设备而接收客户机是PC机时,我们会听到音高变化,反之亦然,这表面上是由于不同的采样率(PC机上的采样率为48000个/秒,手持设备上的采样率为16000个/秒)。由于Chrome的一个bug,这些似乎无法更改。因此,如果我们能使当前的解决方案在所有其他方面都起作用,我们将不得不进行一些重新采样,以考虑不同的速率。我不知道由于不同的硬件而导致的任何其他问题。你还有别的想法吗?谢谢