Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/javascript/461.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Javascript 使用AudioWorklet流式传输捕获的音频时,如何防止中断/断断续续/故障?_Javascript_Websocket_Web Audio Api_Getusermedia_Scriptprocessor - Fatal编程技术网

Javascript 使用AudioWorklet流式传输捕获的音频时,如何防止中断/断断续续/故障?

Javascript 使用AudioWorklet流式传输捕获的音频时,如何防止中断/断断续续/故障?,javascript,websocket,web-audio-api,getusermedia,scriptprocessor,Javascript,Websocket,Web Audio Api,Getusermedia,Scriptprocessor,我们一直在开发一个基于JavaScript的音频聊天客户端,它在浏览器中运行,并通过WebSocket将音频样本发送到服务器。我们以前曾尝试使用Web Audio API的ScriptProcessorNode来获取示例值。这在我们的台式机和笔记本电脑上运行得很好,但在从我们必须支持的手持平台进行传输时,我们的音频质量很差。我们将此归因于有文档记录的脚本处理器性能问题()。在手持设备上,脚本处理器缓冲区大小为2048,音频始终有中断。在下一个最大的间隔(4096),音频是平滑的(没有中断),但是

我们一直在开发一个基于JavaScript的音频聊天客户端,它在浏览器中运行,并通过WebSocket将音频样本发送到服务器。我们以前曾尝试使用Web Audio API的ScriptProcessorNode来获取示例值。这在我们的台式机和笔记本电脑上运行得很好,但在从我们必须支持的手持平台进行传输时,我们的音频质量很差。我们将此归因于有文档记录的脚本处理器性能问题()。在手持设备上,脚本处理器缓冲区大小为2048,音频始终有中断。在下一个最大的间隔(4096),音频是平滑的(没有中断),但是延迟太多(大约两秒)

我们从ScriptProcessorNode得到的结果促使我们对音频工作集进行了实验。不幸的是,在我们的工作集实现中,音频质量更差:中断和延迟,甚至在笔记本电脑上。我想知道是否有办法调整我们的工作集实现以获得更好的性能,或者我们正在经历的是音频工作集的当前状态(铬问题,并且似乎相关)的预期(是“课程标准”)

下面是关于代码作用的更多细节:

  • 使用从getUserMedia获得的MediaStream创建MediaStreamSourceNode
  • 将源节点连接到我们的工作集节点实现(扩展AudioWorkletNode)
  • 我们的工作集处理器实现(扩展了AudioWorkletProcessor)缓冲作为其处理方法的“输入”参数到达的块
  • 当缓冲区已满时,使用MessagePort将缓冲区内容发送到worklet节点
  • Worklet节点通过WebSocket连接传输缓冲区内容
  • 处理方法如下所示。var“samples”是一个Float32Array,它被初始化为缓冲区大小并被重用。我已经尝试过缓冲区大小,但它似乎没有影响。该方法基于的第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。我们的手持设备是松下FZ-N1,在安卓6.0.1上运行Chrome 72.0.3626.105


    感谢您的阅读和提供的任何建议。

    您是否尝试过使用
    MediaSource
    ?另见;也;谢谢您的回复@guest271314。我没有试过MediaSource,但它看起来很有趣。然而,在我们的例子中,我相信延迟和中断的来源是客户端中的捕获/传输管道,而不是播放/接收管道(MediaSource似乎适用的管道)。我们已经听到了相当好的质量播放时,音频捕获和传输的客户端运行在相对强大的硬件。当我们为回放客户端保持硬件不变,但为捕获客户端切换到功能较弱的硬件时,回放质量变得不可接受。您如何在客户端代码中处理不同的硬件?@guest271314:在我们的测试中,当发送客户机是手持设备而接收客户机是PC机时,我们会听到音高变化,反之亦然,这表面上是由于不同的采样率(PC机上的采样率为48000个/秒,手持设备上的采样率为16000个/秒)。由于Chrome的一个bug,这些似乎无法更改。因此,如果我们能使当前的解决方案在所有其他方面都起作用,我们将不得不进行一些重新采样,以考虑不同的速率。我不知道由于不同的硬件而导致的任何其他问题。你还有别的想法吗?谢谢